Fargate中的Docker镜像标签未应用到容器中

81次阅读
没有评论

问题描述

在使用AWS ECS上的Fargate引擎通过Docker容器运行代码时,遇到了一个问题:他期望Docker镜像的标签能够应用到Docker容器中,但实际上并没有生效。
以一个简化的例子来说明,用户构建了一个镜像:

docker build --label asdf=qwer - <<EOFFROM alpineEOF

然后,用户将镜像推送到ECR,并在任务中使用该镜像创建一个容器,最后在服务中启动该容器。
如果用户在容器定义中设置了一个Docker标签,比如qwer=asdf,那么这个标签会显示出来,但是镜像标签asdf=qwer却没有生效。然而,在本地运行时却没有问题:

$ task=$(docker run -d --label qwer=asdf a19a19847) && docker inspect -f'{{json .Config.Labels}}' $task
{"asdf":"qwer","qwer":"asdf"}

用户想知道这个功能是否不受Fargate支持?因为它似乎是内置在Docker中的,所以Fargate可能会有意地删除镜像标签。
从更广泛的角度来看,用户希望能够准确地知道在Docker容器中运行的代码,所以对于这个问题,用户希望得到一个简单的解决方案。用户目前正在使用一个浮动的production镜像标签,并且不希望改变标签的工作流程。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户的描述,Fargate可能会有意地删除镜像标签。因此,我们可以尝试使用其他方法来实现用户的需求,即准确地知道在Docker容器中运行的代码。
一种简单的解决方案是在Docker容器中设置一个环境变量,以便在代码中访问。以下是实现这个解决方案的步骤:
1. 在Dockerfile中添加一个ENV指令,用于设置环境变量。例如,假设用户想要设置一个名为CODE_VERSION的环境变量,可以在Dockerfile中添加以下内容:

ENV CODE_VERSION=1.0.0
  1. 构建并推送镜像到ECR。
  2. 在任务定义中,为容器设置环境变量。可以使用AWS管理控制台或AWS CLI来完成这个步骤。以下是使用AWS CLI的示例命令:
aws ecs update-service --cluster <cluster_name> --service <service_name> --task-definition <task_definition> --container-name <container_name> --environment "name=CODE_VERSION,value=1.0.0"

请注意,上述命令中的<cluster_name><service_name><task_definition><container_name>需要替换为实际的值。
通过这种方式,用户可以在Docker容器中设置一个环境变量,以便在代码中访问。这样,用户就能准确地知道在容器中运行的代码版本。

方案2

如果用户不想改变标签的工作流程,还可以考虑使用Docker镜像的元数据来获取关于代码的信息。Docker镜像的元数据包括标签、作者、描述等信息,可以通过docker inspect命令来查看。以下是一个示例命令:

docker inspect <image_name> --format='{{json .Config.Labels}}'

请将<image_name>替换为实际的镜像名称。
通过这种方式,用户可以获取关于Docker镜像的元数据,从而了解在容器中运行的代码的相关信息。

总结

在Fargate中,Docker镜像的标签可能不会被应用到容器中。为了准确地知道在Docker容器中运行的代码,用户可以尝试使用环境变量或Docker镜像的元数据来获取相关信息。通过这些方法,用户可以满足对代码版本的需求,并且不需要改变标签的工作流程。

正文完