🐳
Dockerビルド時にプライベートリポジトリをクローンする
この記事は約 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
手順
-
GitHub と SSH 接続する設定
- 解説記事は こちら
-
ssh-agent に GitHub の秘密鍵を登録する
ssh-add -K ~/.ssh/your_secret_key
-
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 \ git clone git@github.com:myorg/myproject.git
- 先頭に
# syntax=docker/dockerfile:1
を記載 - ベストプラクティス に従い、非 Root ユーザーを使用するよう設定
- ホスト上の ssh-agent を使用するために
--mount=type=ssh
を指定 - 使用するユーザー ID を
uid=1000
で指定
- 先頭に
-
イメージをビルド
export DOCKER_BUILDKIT=1 docker build -t sample_docker_ssh --ssh default .
- BuildKit での構築を有効化するために
DOCKER_BUILDKIT=1
を環境変数に設定 -
--ssh
オプションを使用することでホスト上の ssh-agent へ接続するソケットを指定
- BuildKit での構築を有効化するために
-
イメージ内にプライベートリポジトリがクローンされたか確認
docker run -it sample_docker_ssh # コンテナ内で実行 $ ls myproject
-
以上
Docker Compose からビルドするケース
-
docker-compose.yml
を作成docker-compose.ymlversion: "3.9" services: app: image: sample_docker_ssh build: context: . dockerfile: Dockerfile container_name: sample_docker_ssh tty: true working_dir: /home/zenn/myproject
-
ビルド
export COMPOSE_DOCKER_CLI_BUILD=1 export DOCKER_BUILDKIT=1 docker compose build --ssh default
-
以上
【おまけ】 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
参考
関連記事
Discussion