web-dev-qa-db-ja.com

Dockerfileキャッシングgit cloneを防ぐ方法

Webアプリをパッケージ化してコンテナーにデプロイしようとするDockerfileがあります。アプリのコードは、Dockerイメージの構築中にgitリポジトリから取得します。 Dockerfileスナップショットは次のとおりです。

........
RUN git clone --depth=1 git-repository-url $GIT_HOME/
RUN mvn package -Dmaven.test.skip
........

リポジトリで進行中の更新がDockerイメージの構築に反映されるように、DockerがRUN git clone --depth=1 git-repository-url $GIT_HOME/のステップをキャッシュしないようにします。それを達成することは可能ですか?

26
Raindy

別の回避策:

Github(またはgitlabまたはbitbucketを使用する可能性が高い)を使用する場合、リポジトリのgithub APIの表現をダミーの場所に追加できます。

   ADD https://api.github.com/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json
   RUN git clone -b$BRANCH https://github.com/$USER/$REPO.git $GIT_HOME/

API呼び出しは、ヘッドが変更されると異なる結果を返し、Dockerのキャッシュを無効にします。

プライベートリポジトリを扱う場合は、 github's x-oauth-basic認証スキームパーソナルアクセストークン のように:

   ADD https://$ACCESS_TOKEN:[email protected]/repos/$USER/$REPO/git/refs/heads/$BRANCH version.json

(thx @captnolimarは、認証を明確にするための編集案を提案します)

35
anq

Issue 1996 はまだ利用できませんが、 次の回避策 があります:

FROM foo
ARG CACHE_DATE=2016-01-01
RUN git clone ...

docker build --build-arg CACHE_DATE=$(date) ....

これは、ビルドごとにARG CACHE_DATE行の後のキャッシュを無効にします。

または:

ADD http://www.convert-unix-time.com/api?timestamp=now /tmp/bustcache
RUN git pull

これは、このADD行の後のキャッシュも無効にします。

類似のアイデア

ARGコマンドをDockerfileに追加します。

# Dockerfile
# add this and below command will run without cache
ARG CACHEBUST=1

選択したキャッシュで再構築する必要がある場合は、--build-argオプションで実行します

$ docker build -t your-image --build-arg CACHEBUST=$(date +%s) .

dockerfileのARGコマンドの下のレイヤーのみが再構築されます。

13
VonC

Githubを使用する場合は、github APIを使用して特定のRUNコマンドをキャッシュしないようにすることができます。 JSONを解析するにはjqをインストールする必要があります:apt-get install -y jq

例:

docker build --build-arg SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | jq -r '.[0].sha') -t imageName .

Dockerfile内(ARGコマンドはRUNの直前にある必要があります):

ARG SHA=LATEST
RUN SHA=${SHA} \
    git clone https://github.com/Tencent/mars.git

または、jqをインストールしたくない場合

SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | grep sha | head -1)

リポジトリに新しいコミットがある場合、git cloneが実行されます。

4

私はこの同じ問題に自分で遭遇し、--no-cacheオプションは、gitリポジトリを選択するのではなく、イメージをビルドするときに使用します。

docker build --no-cache -t my_image .
3
tomgsmith99

Githubプライベートリポジトリの場合、ユーザー名とパスワードを渡すこともできます。

RUN git clone -b$BRANCH https://$USER:[email protected]/$USER/$REPO.git $GIT_HOME/

1
manymoons