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/
のステップをキャッシュしないようにします。それを達成することは可能ですか?
別の回避策:
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は、認証を明確にするための編集案を提案します)
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
コマンドの下のレイヤーのみが再構築されます。
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が実行されます。
私はこの同じ問題に自分で遭遇し、--no-cache
オプションは、gitリポジトリを選択するのではなく、イメージをビルドするときに使用します。
docker build --no-cache -t my_image .
Githubプライベートリポジトリの場合、ユーザー名とパスワードを渡すこともできます。
RUN git clone -b$BRANCH https://$USER:[email protected]/$USER/$REPO.git $GIT_HOME/