🐳

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

2022/10/15に公開

この記事は約 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