我已经构建了一个安装了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"]