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

时间:2021-02-01 02:49:48

标签: docker shell aws-cli alpine

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

  • aws cli v1 位于 /usr/bin
  • aws cli 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 变量。这将是一个通用请求。

1 个答案:

答案 0 :(得分:1)

解决此问题的最简单、最可靠的方法是维护两个单独的映像,每个版本的 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"]