git clone
Dockerビルド内からプライベートリポジトリの実行を望まないことがよくあります。そこでクローンを行うには、プライベートssh資格情報をイメージ内に配置する必要があります。この資格情報は、後でイメージへのアクセス権を持つユーザーが抽出できます。
代わりに、一般的な方法は、選択したCIツールのdockerの外部からgitリポジトリを複製することです。 COPY
、ファイルをイメージすることです。これには2番目の利点があります。Dockerキャッシングです。Dockerキャッシングは、実行中のコマンド、それに含まれる環境変数、入力ファイルなどを調べ、それらが同じ親ステップからの以前のビルドと同一である場合、以前のキャッシュを再利用します。ではgit clone
、コマンド、コマンド自体は同じなので、ドッキングウィンドウは、外部のGitのレポが変更された場合でも、キャッシュを再利用します。ただし、COPY
コマンドはビルドコンテキストでファイルを見て、それらが同一であるか更新されているかを確認し、適切な場合にのみキャッシュを使用します。
ビルドに認証情報を追加する場合は、マルチステージビルドで追加することを検討してください。これらの認証情報は、タグ付けされておらず、ビルドホストの外にプッシュされることのない早い段階にのみ配置してください。結果は次のようになります。
FROM ubuntu as clone
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
COPY id_rsa /root/.ssh/id_rsa
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
FROM ubuntu as release
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
COPY --from=clone /repo /repo
...
最近では、BuildKitは、sshキーをイメージとして書き込まれないマウントとして渡すことができるいくつかの実験的な機能をテストしています。
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_rsa \
git clone git@bitbucket.org:User/repo.git
そして、あなたはそれを使ってそれを構築することができます:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
この場合も、パスワードで保護されていないsshキーが必要ですが、少なくとも1つのステージでビルドを実行し、COPYコマンドを削除して、ssh資格情報がイメージの一部にならないようにすることができます。
BuildKitには、ssh専用の機能も追加されています。これにより、パスワードで保護されたsshキーを保持できます。結果は次のようになります。
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=ssh \
git clone git@bitbucket.org:User/repo.git
そして、あなたはそれを使ってそれを構築することができます:
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--ssh default=$SSH_AUTH_SOCK .
繰り返しになりますが、これはイメージレイヤーに書き込まれることなくビルドに注入されるため、資格情報が誤って漏洩するリスクを排除できます。
git clone
以前の行がキャッシュされている場合でもdockerに強制的に実行させるには、ビルドごとに変化するビルドARGを挿入してキャッシュを壊すことができます。それは次のようになります:
# inject a datestamp arg which is treated as an environment variable and
# will break the cache for the next RUN command
ARG DATE_STAMP
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
次に、変更する引数をdocker buildコマンドに挿入します。
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .