运行 aws cli v1 和 v2 在同一 docker 图像中
Run aws cli v1 and v2 in same docker image
我构建了一个安装了 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
变量。这将是一个通用请求。
解决这个问题的最简单和最可靠的方法是维护两个单独的映像,每个映像对应一个 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"]
我构建了一个安装了 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
变量。这将是一个通用请求。
解决这个问题的最简单和最可靠的方法是维护两个单独的映像,每个映像对应一个 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"]