运行 aws cli v1 和 v2 在同一 docker 图像中

Run aws cli v1 and v2 in same docker image

我构建了一个安装了 aws cli v1 和 v2 的镜像。

现在,我想 docker run 设置一个默认的 aws cli 版本,如果可能的话,可以使用一个环境变量来切换。

如:

# docker run -ti --rm -e version=v2 awscli_image bash
$ which aws
/usr/local/bin/aws

# docker run -ti --rm -e version=v1 awscli_image bash
$ which aws
/usr/bin/aws

有什么建议可以使这项工作有效吗?

所以问题就变成了如何在运行容器中调整PATH变量。这将是一个通用请求。

解决这个问题的最简单和最可靠的方法是维护两个单独的映像,每个映像对应一个 CLI 工具版本。然后就没有问题了 $PATH 中哪个先出现,并且图像本身不会包含您不使用的工具版本。

docker run --rm awscli_image:v1 aws sts get-caller-identity
docker run --rm awscli_image:v2 aws sts get-caller-identity

如果他们真的必须在同一个图像中,您可以使用入口点包装器脚本来查看环境变量设置。如果将图像的 ENTRYPOINT 设置为 shell 脚本 it will get passed the CMD as arguments,并且脚本可以 exec "$@" 结尾,实际上 运行 CMD .

对于您的示例,您可以编写如下包装器:

#!/bin/sh
# Push something on to $PATH depending on the environment
case "$version" in
  v1) PATH="/usr/bin:$PATH" ;;
  v2) PATH="/usr/local/bin:$PATH" ;;
esac
# Then run the CMD
exec "$@"

在您的 Dockerfile 中,COPY 此脚本正常运行并将其设置为 ENTRYPOINT

COPY entrypoint.sh /usr/local/bin
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] # must be JSON-array syntax
CMD ["aws", "--help"]