How to use multiple image tags with docker-compose
根据这一点和Github的问题,目前,在使用
我的用例是构建在
虽然使用docker标记的普通
在不需要先硬编码/复制图像名称的情况下,用
我想出了几个不同复杂性的解决办法。它们都依赖于这样的假设:
1 2 3 4 5 | 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 |
但是,如果有人在
使用
然后,只需运行构建过程两次,每次用不同的值替换
1 2 | IMAGE_TAG="${IMAGE_TAG}" docker-compose build IMAGE_TAG=latest docker-compose build |
第二个构建过程应该比第一个快得多,因为从第一次运行开始,所有图像层都应该缓存。
这种方法的缺点是,它将为每个服务注入两个后续的构建过程,这可能会使在日志输出中搜索有用的内容变得更加困难。
此外,如果您的
使用python(或任何其他语言,如
在python中,可能如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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(" ".join(image_names)) EOF ) for image in ${images} do docker tag ${image}:${IMAGE_TAG} ${image}:latest done |
这种方法的缺点是,执行构建的机器必须安装python3以及pyyaml库。如前所述,此模式同样可以用于python2或安装的任何其他编程语言。
结合一些下面的方法使用一些本地的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 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 |
虽然这种方法没有任何外部依赖性,而且比
您还可以采用以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 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} |
然后您只需运行
我有一些使用环境变量(默认变量值的bash语法,在我的例子中是
1 2 3 4 5 | version: '3' services: app: build: . image: myapp-name:${version:-latest} |
使用默认标记生成并推送(如果需要推送到注册表),使用环境变量更改版本,然后再次生成并推送:
1 2 3 4 5 | docker-compose build docker-compose push export version=0.0.1 docker-compose build docker-compose push |