2017-11-16 3 views
2

thisthis GitHubの問題によると、現在、1枚のまたは複数の画像を構築するためにdocker-composeを使用した場合、サービスのイメージのために複数のタグを供給するためにどのようにネイティブ方法はありません。で複数の画像タグを使用するドッキングウィンドウ-構成する方法

これは、docker-compose.ymlファイルで定義された画像を作成し、カスタマイズされたタグ(ビルド番号や日付など)を付けて一度だけタグ付けし、一度latestとタグ付けすることです。

dockerdocker tagを使用して簡単に行うことができますが、docker-composeimage keyに1つのタグを設定することしかできません。 docker-composeと一緒にdocker tagを使用することは私のドッカー関連の定義をすべてdocker-compose.ymlファイルに保存し、それらをビルドスクリプトにコピーしないでください。

複数のタグをdocker-composeで設定し、画像名を最初にハードコード/コピーしなくても、うまくいく回避策はありますか?

答えて

1

私は、複雑さの異なるいくつかの回避策を考え出しました。それらはすべて、${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-テンプレートを使用して)いくつかのネイティブdockerdocker-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方法よりも安全であるわけではありませんが、それは(ただし問題一般的ではない)コンテナを作成し、除去するために大規模なセットアップに実行するためにさらに数秒かかる場合があります。

+1

画像化の正しいセットを構築し、プッシュします

# build is your actual build spec build: image: myrepo/myimage build: ... ... # these extend from build and just add new tags statically or from environment variables or version_tag: extends: build image: myrepo/myimage:v1.0 some_other_tag: extends: build image: myrepo/myimage:${SOME_OTHER_TAG} 

をあなたの最初の例では、すべてのコメントを取り除き、config文だけを残します。 e。 'docker-compose config | grep 'イメージ:' | awk -F ': "' {print"イメージ "$ 2"、タグ ​​"$ 3}"は私のためです。 –

2

また、次のアプローチ取ることができます:あなたはそれからちょうどdocker-compose builddocker-compose pushを実行することができますし、あなたが `ドッキングウィンドウ・コン設定を実行することができますタグ付き

関連する問題