【问题标题】:Run aws cli v1 and v2 in same docker image在同一个 docker 映像中运行 aws cli v1 和 v2
【发布时间】:2021-02-01 02:49:48
【问题描述】:

我已经构建了一个安装了 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 变量。这将是一个通用请求。

【问题讨论】:

    标签: docker shell aws-cli alpine


    【解决方案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"]
    

    【讨论】:

    • 是的,我想避免构建两个图像。让我先测试入口点脚本
    • 工作,非常感谢。顺便说一句,case语句应该是in,而不是of
    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2017-04-20
    • 2020-09-29
    • 1970-01-01
    • 2020-04-11
    • 2020-06-27
    • 2022-06-16
    相关资源
    最近更新 更多