docker - 带有构建参数的ENTRYPOINT和CMD

标签 docker dockerfile

这不起作用:

FROM alpine:3.7

# build argument with default value
ARG PING_HOST=localhost

# environment variable with same value
ENV PING_HOST=${PING_HOST}

# act as executable
ENTRYPOINT ["/bin/ping"]

# default command
CMD ["${PING_HOST}"]

应该可以使用build-arg构建镜像,并可以使用环境变量启动容器来覆盖cmd。
docker build -t ping-image .
docker run -it --rm ping-image

错误:ping:地址错误“$ {PING_HOST}”

更新:
FROM alpine:3.7

# build argument with default value
ARG PING_HOST=localhost

# environment variable with same value
ENV PING_HOST ${PING_HOST}

COPY ./entrypoint.sh /usr/local/bin/

# act as executable
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

# default command
CMD $PING_HOST

入口点
#!/bin/sh

/bin/ping $PING_HOST

这是有效的,因为entrypoint.sh启用了预期的变量替换。

最佳答案

对于CMD扩展变量,您需要安排一个shell,因为shell负责扩展环境变量,而不是Docker。您可以这样做:

ENTRYPOINT ["/bin/sh"]
CMD ["-c" , "ping ${PING_HOST}"]

要么
CMD ["sh", "-c", "ping ${PING_HOST}"]

关于docker - 带有构建参数的ENTRYPOINT和CMD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092538/

相关文章:

docker - 如何在无根容器上启用端口绑定(bind)?

docker - 尝试在 google cloud run 上安装日志记录但失败

docker - 有没有办法在 docker-compose.yml 文件中设置 Docker 容器的 mac 地址?

node.js - 使用 Docker 容器的 MEAN 堆栈

docker - 如何在 docker 容器内从头开始构建新应用程序?

java - 如果我们在 dockerfile 中使用 CMD,Docker 多阶段构建会失败

amazon-web-services - 无法在aufs/diff中找到Container文件夹

docker - 如何从 minikube 中删除现有的已下载 docker 镜像

docker - 启动仪表板时,以Docker模式运行的Minikube返回503

bash - sed 不能在 dockerfile 中工作,但在容器 bash 中可以