dockerfile:如何使用基础镜像中的 CMD 或 ENTRYPOINT
Posted
技术标签:
【中文标题】dockerfile:如何使用基础镜像中的 CMD 或 ENTRYPOINT【英文标题】:dockerfile: how use CMD or ENTRYPOINT from base image 【发布时间】:2017-08-31 10:07:21 【问题描述】:我有几个不属于我的基础 docker 镜像(所以我无法修改它们)。但是,我正在使用它们创建新图像并安装了其他东西。
我不知道如何告诉 dockerfile 复制基本映像的 CMD(或 ENTRYPOINT)。像这样的:
FROM other:latest
RUN my-extra-install
CMD <use-the-CMD-from-base-image>
我认为 CMD 命令没有任何直接的语法来执行我想要的操作。我想知道是否有解决方法。
【问题讨论】:
【参考方案1】:@Vor 是对的。但万一
# Dockerfile
FROM nginx:stable-alpine
ENTRYPOINT ["/docker-entrypoint.sh"]
COPY ./docker-entrypoint.sh /
和
# docker-entrypoint.sh
#!/usr/bin/env sh
set -e
exec "$@"
nginx:stable-alpine
的默认 CMD 不会在 exec "$@"
中执行。
你必须在Dockerfile中自己写默认的nginx-alpine的CMD
(!)
# Dockerfile
FROM nginx:stable-alpine
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
COPY ./docker-entrypoint.sh /
或更改您的 docker-entrypoint.sh
# docker-entrypoint.sh
#!/usr/bin/env sh
set -e
exec nginx -g "daemon off;"
希望对你有帮助
【讨论】:
【参考方案2】:如果您在新的 Dockerfile 中将其留空,它将继承基础镜像中的那个。
例如:
基础
FROM ubuntu
CMD ["echo", "AAA"]
layer1
FROM base
如果您构建上述图像并运行layer1
,您将获得以下信息:
$ sudo docker run -it layer1
AAA
【讨论】:
我以为我试过了,但失败了。但我又试了一次,它确实有效。 @Vor ENTRYPOINT 不同吗?如果我的图像和基础都有一个入口点怎么办? @williamli 如果你省略 ENTRYPOINT,它也会从基础镜像中获取以上是关于dockerfile:如何使用基础镜像中的 CMD 或 ENTRYPOINT的主要内容,如果未能解决你的问题,请参考以下文章