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



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

  • aws cli v1 at/usr/bin
  • 命令行v2/usr/local/bin

现在,我想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脚本,它将被传递CMD作为参数,并且该脚本可以以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"]