🐳

Dockerビルド時にプライベートリポジトリをクローンする

2022/10/15に公開約4,200字

この記事は約 5 分で読めます。

結論

Docker ビルド時に -ssh オプションを使用して、ホストの SSH を使用するよう指定

docker build --ssh default .

はじめに

こんにちは。バックエンドエンジニアの「りょう」と申します。

突然ですがみなさんの現場では Docker を活用していますか?

私は最近業務で環境構築の簡素化・開発環境の統一化を目的に、プロジェクトに Docker 環境を導入しました。

その際、 Docker ビルド時に「プライベートリポジトリをクローン」する必要があり、色々調査した結果を共有したいと思います。

また実際によく使用される Docker Compose からビルドするケースも最後に解説します。

間違いなどありましたらコメント等でご指摘頂けると幸いです。

環境

  • macOS Monterey v12.6
  • Docker v20.10.17
  • Docker compose v2.7.0

手順

  1. GitHub と SSH 接続する設定

    • 解説記事はこちら
    • ssh-agentにGitHubの秘密鍵を登録する
      • ssh-add -K ~/.ssh/your_secret_key
  2. Dockerfile を作成

    Dockerfile
    # syntax=docker/dockerfile:1
    FROM alpine
    
    # パッケージをインストール
    RUN apk update && \
        apk --no-cache add \
        git \
        openssh
    
    # 非rootユーザーを使用
    ENV USER zenn
    ENV HOME /home/$USER
    RUN addgroup -S $USER && \
        adduser -S -u 1000 -G $USER $USER && \
        chown -R $USER:$USER $HOME
    USER $USER
    
    WORKDIR $HOME
    
    # GitHubにSSH接続するための設定
    RUN mkdir -p -m 0700 ~/.ssh && \
        ssh-keyscan github.com >> ~/.ssh/known_hosts && \
        git config --global url.git@github.com:.insteadOf https://github.com/
    
    # プライベートリポジトリをクローン
    RUN --mount=type=ssh,uid=1000 \
        git clone git@github.com:myorg/myproject.git
    
    • 先頭に # syntax=docker/dockerfile:1 を記載
    • ベストプラクティスに従い、非 Root ユーザを使用するよう設定
    • ホスト上の ssh-agent を使用するために --mount=type=ssh を指定
    • 使用するユーザー ID を uid=1000 で指定
  3. イメージをビルド

    $ export DOCKER_BUILDKIT=1
    $ docker build -t sample_docker_ssh --ssh default .
    
    • BuildKit での構築を有効化するために DOCKER_BUILDKIT=1 を環境変数に設定
    • --ssh オプションを使用することでホスト上の ssh-agent へ接続するソケットを指定
  4. イメージ内にプライベートリポジトリがクローンされたか確認

    $ docker run -it sample_docker_ssh
    
    # コンテナ内で実行
    $ ls
    myproject
    
  5. 以上

Docker Compose からビルドするケース

  1. docker-compose.yml を作成

    docker-compose.yml
    version: "3.9"
    services:
      app:
        image: sample_docker_ssh
        build:
          context: .
          dockerfile: Dockerfile
        container_name: sample_docker_ssh
        tty: true
        working_dir: /home/zenn/myproject
    
  2. ビルド

    $ export COMPOSE_DOCKER_CLI_BUILD=1
    $ export DOCKER_BUILDKIT=1
    $ docker compose build --ssh default
    
  3. 以上

【おまけ】Makefileの作成

Makefile を作成すると、チームメンバーが簡単に Docker の環境構築が行えるようになるのでオススメです。

Makefile
.PHONY: help build up down restart exec logs ps setEnv

help: ## Show options
  @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
    awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

build: setEnv ## Build docker container
  docker compose build --ssh default

up: ## Do docker compose up in detached mode
  docker compose up -d

down: ## Do docker compose down
  docker compose down

restart: down up ## Do docker compose restart

exec: up ## Execute a command in a running app container
  docker compose exec -it app ash

logs: ## Tail docker compose logs
  docker compose logs -f

ps: ## Check container status
  docker compose ps

setEnv: ## Set Env to use SSH in Docker container
  export COMPOSE_DOCKER_CLI_BUILD=1 export DOCKER_BUILDKIT=1
$ make help
help                 Show options
build                Build docker container
up                   Do docker compose up in detached mode
down                 Do docker compose down
restart              Do docker compose restart
exec                 Execute a command in a running app container
logs                 Tail docker compose logs
ps                   Check container status
setEnv               Set Env to use SSH in Docker container

参考

Docker公式ドキュメント(日本語版)

関連記事

https://zenn.dev/ryo_f/articles/f63b0bffe2eb77

GitHubで編集を提案

Discussion

ログインするとコメントできます