shell 如何从docker-compose构建输出中提取图像名称和标签

axzmvihb  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(133)

我有下面的脚本,我希望将构建和发布到我的Azure容器注册表。

echo "env override file:${1}"

cd ../.devcontainer
docker compose --env-file .env --env-file $1 build

#parse image name and tag from above output here into $docker_image and $tag

docker image tag $docker_image:$tag mycontainerreg.azurecr.io/$docker_image:latest 
docker push mycontainerreg.azurecr.io/$docker_image:latest

在compose命令之后,显示的最后一个输出是:
=> => naming to docker.io/library/my_app:v1.0
我希望能够从输出中提取图像名称和标签,以便在后续的docker命令中使用。我该怎么做?
另外,标记的最佳实践是什么?我用版本号标记。但是我是否也应该像我一样重新标记为最新版本-因为它会简化下游部署?
为了完整性,我的docker-compose相关上下文:

services:
  my_app:
    container_name: my_app_${ENV}
    image: "my_app:${VERSION:-local}"

env文件包括.env、env_dev等:

VERSION=v1.0
ENV=local
USER_ID=1000
GROUP_ID=1000
USER_NAME=user1
SVC_PORT=5000
DB_PORT=5434
bkkx9g8r

bkkx9g8r1#

将输出存储在变量中,让它成为输出

output="=> => naming to docker.io/library/my_app:v1.0"

image_and_tag=$(echo "$output" | awk -F '/' '{print $NF}')
image_name=$(echo "$image_and_tag" | awk -F ':' '{print $1}')
image_tag=$(echo "$image_and_tag" | awk -F ':' '{print $2}')

echo "Image Name: $image_name"
echo "Image Tag: $image_tag"

关于标记:

  • 为生产部署使用特定的版本标签(例如,v1.0、v1.1)。
  • 在测试、开发和内部使用时使用“latest”标签,但避免在生产环境中使用。
  • 在适当的时候定期将“latest”标签更新为最新的稳定版本,但确保在部署到生产环境之前进行彻底的测试。
a0x5cqrl

a0x5cqrl2#

我只是从Compose文件中复制image:,而不尝试解析Compose的输出。Compose的环境变量替换是POSIX shell语法的一个子集,您应该能够在脚本中使用完全相同的字符串格式。

docker tag my_app:${VERSION:-local} mycontainerreg.azurecr.io/$docker_image:latest

当您在Compose文件中同时设置build:image:时,image:将设置构建映像的名称,因此更好的方法可能是将Compose image:设置为您想要的。然后,您可以docker-compose push构建的映像,而无需手动提取其名称。

services:
  my_app:
    build: .
    image: mycontainerreg.azurecr.io/myapp:${VERSION:-latest}
    # should not usually need container_name:
export VERSION=20230905
docker-compose build
docker-compose push

我建议使用日期戳、源代码控制提交ID或版本字符串标记图像是最佳实践。像latest这样的固定标签可能会导致一些问题,特别是如果你使用Kubernetes,因为不清楚你使用的是哪个“最新”镜像-如果本地系统已经有一个“最新”镜像,那么容器系统通常不会检查上游注册表是否有一个更新的镜像。

相关问题