私は、複雑さの異なるいくつかの回避策を考え出しました。それらはすべて、${IMAGE_TAG}
が、例えば、を表すカスタマイズされたタグを格納するという仮定に頼っている。ビルドNo。すべてのサービスの画像にこのタグとlatest
のタグを付けたいとします。 docker-compose.yml
ファイル
images=$(cat docker-compose.yml | grep 'image: ' | cut -d':' -f 2 | tr -d '"')
for image in $images
do
docker tag "${image}":"${IMAGE_TAG}" "${image}":latest
done
から
grep
画像の名前誰かが例えばでしょうdocker-compose.yml
にコメントを追加した場合ただし、これはエラーが発生しやすくなります# Purpose of this image: do something useful...
のように見えます。
あなたdocker-compose.yml
ファイルに二回
使用${IMAGE_TAG}
環境変数としてビルドhere in the first exampleを説明しました。
その後、単に異なる値と${IMAGE_TAG}
を代入し、二回するたびにビルドプロセスを実行します。
IMAGE_TAG="${IMAGE_TAG}" docker-compose build
IMAGE_TAG=latest docker-compose build
すべての画像層は依然としてからキャッシュしなければならないので二ビルドプロセスが最初のものよりもはるかに高速でなければなりません最初の実行。
このアプローチの欠点は、単一のサービスごとに2つの後続のビルドプロセスでログ出力をフラッドさせ、何か役に立つものを探し出すのが難しくなることです。
以外にも、あなたは常にビルドキャッシュをフラッシュあなたのDockerfile
で任意のコマンドを持っている場合(例えば、自動更新last-modified
ヘッダを遠隔地からのフェッチADD
コマンド、常に外部プロセスなどによって更新されたファイルを追加)余分なビルドは物事を大幅に遅くするかもしれません。
Pythonで本当のyaml
パーサ(または、そのようなRuby
またはperl
または任意のシステムにインストールされているなど、他の言語)を使用して、いくつかのインラインPythonコード
とdocker-compose.yml
ファイルから解析用画像の名前はより堅牢です最初にgrep
というアプローチを使用しました。これは、コメントまたは奇妙ではありますが、yml
というファイルを書くのに妥当な方法で混乱することはありません。
Pythonでは、これは次のようになります。このアプローチの
images=$(python3 <<-EOF # make sure below to indent with tabs, not spaces; or omit the "-" before "EOF" and use no indention at all
import yaml
content = yaml.load(open("docker-compose.build.yml"))
services = content["services"].values()
image_names = (service["image"].split(":")[0] for service in services)
print("\n".join(image_names))
EOF
)
for image in ${images}
do
docker tag ${image}:${IMAGE_TAG} ${image}:latest
done
欠点は、ビルドを実行するマシンがのpython3がPyYAMLライブラリと一緒に、インストールされている必要があることです。既に述べたように、このパターンは、Python2やインストールされている他のプログラミング言語でも同様に使用できます。
は、いくつかのdocker
コマンドの組み合わせ
と画像名を取得します(GO-テンプレートを使用して)いくつかのネイティブdocker
とdocker-compose
コマンドを使用して、次のアプローチは、もう少し複雑に書き込むことですが、またうまく動作します。
# this should be set to something unique in order to avoid conflicts with other running docker-compose projects
compose_project_name=myproject.tagging
# create containers for all services without starting them
docker-compose --project-name "${compose_project_name}" up --no-start
# get image names without tags for all started containers
images=$(docker-compose --project-name "${compose_project_name}" images -q | xargs docker inspect --format='{{ index .RepoTags 0}}' | cut -d':' -f1)
# iterate over images and re-tag
for image in ${images}
do
docker tag "${image}":"${IMAGE_TAG}" "${image}":latest
done
# clean-up created containers again
docker-compose --project-name "${compose_project_name}" down
このアプローチは、任意の外部依存関係を持っており、grep
方法よりも安全であるわけではありませんが、それは(ただし問題一般的ではない)コンテナを作成し、除去するために大規模なセットアップに実行するためにさらに数秒かかる場合があります。
画像化の正しいセットを構築し、プッシュします
をあなたの最初の例では、すべてのコメントを取り除き、config文だけを残します。 e。 'docker-compose config | grep 'イメージ:' | awk -F ': "' {print"イメージ "$ 2"、タグ "$ 3}"は私のためです。 –