docker - 如何通过变量扩展将参数传递给 ENTRYPOINT?
问题描述
我正在构建一个基于我无法控制的其他图像的 docker 图像。基本图像通过简单地通过命令ENTRYPOINT
传递参数来设置我想要使用的。CMD
我还需要在参数中使用运行时变量扩展。这是我的 Dockerfile
FROM base # I do not control base, but I need to call its ENTRYPOINT.
# The "as default parameters to ENTRYPOINT" form. Does not expand variables.
CMD [ "--port", "$PORT" ]
# The "exec" from. I can't use it, because I do not know path to the executable as the base image is outside my control.
CMD [ "executable", "--port", "$PORT" ]
# The "shell" form. Won't even build because "--port" is interpreted as flag of "CMD".
CMD --port $PORT
如代码中所述,文档提供的三种形式均不适用于我的用例。
解决方案
在这种情况下,您不能使用CMD
变量扩展。
Docker 本身不知道如何在容器命令中扩展变量。正如您所注意到的,有两种语法:
CMD ["cmd", "$option"]
从字面上传递cmd
和$option
作为参数,根本没有扩展CMD cmd $option
只是将该字符串包装在 shell 调用中,相当于CMD ["sh", "-c", "cmd $option"]
,并依赖于该 shell 来进行扩展。
在评论中,您提到了特定图像。如果您查看它生成的历史记录,它使用“容器即命令”模式,其中ENTRYPOINT
是要启动的命令,而 是该命令的CMD
参数。除非该命令特别希望接收sh
和-c
作为选项,否则这是行不通的;但是sh -c
包装器是 Docker 在启动时必须引起变量扩展的唯一方法。
您更具体地说是在尝试传递一个--port
选项。这会影响容器内进程侦听的端口。由于容器在隔离的网络命名空间中运行,因此通常没有理由需要更改它:即使您有十几个容器都在侦听标准 HTTP 端口 80,它们也不会发生冲突。
如果你想从 Docker 外部连接到容器,你只需要更改docker run -p
端口映射。同样,镜像文档建议启动镜像以docker run -p 8080:80
使其可从主机端口 8080 访问;如果您想要不同的主机端口,请更改该号码,并保持第二个端口号相同。
推荐阅读
- regex - Fluentd 匹配标签通配符模式匹配下面的模式呢?
- azure - 如何获取 Azure 应用服务审核日志(不使用应用洞察)
- json - 如何在 Swift 5 中从 URL 访问 JSON 数据
- javascript - javascript中的警告框问题
- python - bbox 在模块内输入精确坐标时工作,但因变量包含相同数据而失败
- csv - 如何将 Zimbra 数据解析为 CSV
- sql-server - 无需修改代码即可连接到 SQL Server 和 SQL Server Compact
- asp.net-core - 如何绑定到 Blazor 中的列表?
- python - 我应该如何从这个文本文件构建实体识别模型
- html - 更改 html 输入类型日期的占位符样式