docker - 具有环境变量和可重写 CMD 的 ENTRYPOINT

标签 docker

这允许 $ENV_VAR传递至foo

ENTRYPOINT /usr/bin/foo $ENV_VAR

这不会,因为传递的是文字字符串“$ENV_VAR”,而不是环境变量的内容。

ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"]

这允许覆盖 CMD

ENTRYPOINT ["/usr/bin/foo"]
CMD ["--some-flag"]

这不允许 CMD 到达入口点。它似乎在两个单独的命令中运行它。即:sh /usr/bin/foo && sh --some-flag

ENTRYPOINT /usr/bin/foo
CMD --some-flag

如何创建一个使用环境变量并具有可重写 CMD 的 ENTRYPOINT?最好采用如下形式

注意:这不起作用

ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"]
CMD ["--some-flag"]

最佳答案

note: this does not work

ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"]
CMD ["--some-flag"]

这将运行 foo,并以 $ENV_VAR 作为第一个参数,以 --some-flag 作为第二个参数。您想要的是将 $ENV_VAR 转换为环境变量值,这是由 shell 完成的。 ENTRYPOINT/CMD 的 json 语法显式禁用 shell,因此由您的可执行文件扩展该值。


如果您尝试将 ENTRYPOINT 更改为 shell 语法:

ENTRYPOINT /usr/bin/foo "$ENV_VAR"
CMD ["--some-flag"]

你会发现 docker 将其转换为运行:

/bin/sh -c "/usr/bin/foo \"$ENV_VAR\"" "--some-flag"

如果您查看有关 -c 选项的文档,您会发现这只需要一个参数。因此,此选项不适用于在引号之外传递的 --some-flag 选项。


最简单的解决方案是将其移至 shell 脚本:

#!/bin/sh
exec /usr/bin/foo "$ENV_VAR" "$@"

将其作为entrypoint.sh复制到您的容器中:

COPY entrypoint.sh /
RUN chmod 755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["--some-flag"]

请注意,仅当您无法使脚本在所有构建主机/代码存储库上可执行时才需要 chmod 命令(有时在 Windows 用户中会出现)。

关于docker - 具有环境变量和可重写 CMD 的 ENTRYPOINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308754/

相关文章:

php - Docker-php-ext-install mcrypt 缺少文件夹

rvm - Docker : RVM command not found

docker - 主机上的 chown docker 卷(可能通过 docker-compose)

docker - Kubernetes 不会在没有 https 的情况下从私有(private)存储库中提取 docker 镜像

docker - 使用 gocd CI/CD 运行 docker 容器

java - 减少多模块 Maven 项目的 Docker 镜像大小

docker - Deis.io-如何调试未运行的应用程序?

python-3.x - 如何在docker compose中的不同端口上运行的另一个 flask 容器中调用一个容器的端点?

Docker 启动后立即退出

docker - 运行多个网站-Docker Compose