基于基础镜像的entrypoint Dockerfile

3

我有一个非常简单的 Dockerfile,如下所示:

FROM my-base-image
COPY abc.properties /opt/conf/

现在我的基础镜像有一个Docker入口点(在其Dockerfile的末尾),但是如您所见,这个结果镜像没有。这样做可以吗?或者我们需要在任何给定的Dockerfile中有一个docker入口点/CMD。此外,COPY指令在生成的镜像中的执行顺序是什么?我的意思是,由于此Dockerfile没有入口点,它将从基础镜像中执行一个入口点,但是当容器启动时,这将在COPY指令之后执行还是先执行基础镜像入口点然后执行此COPY指令。

只是在寻找有关Docker的概念。


它应该从基础类继承;你只需要运行生成的镜像就可以找出来。我不确定你所问的“执行顺序”问题是什么,Dockerfile中的事情通常是按顺序发生的。 - David Maze
当然,David。我的意思是,由于基础镜像将首先被拉取,因此它的入口点将被执行(在该基础镜像的末尾),那么它将如何执行COPY指令。只是好奇。 - Ashley
2个回答

7

几个 Dockerfile 指令(特别是 ENTRYPOINT 和 CMD,但也包括 EXPOSE、LABEL 和 MAINTAINER)只是在镜像中设置元数据;它们本身并不会做任何事情。在单个 Dockerfile 中,这样做完全没问题:

FROM ubuntu:18.04
WORKDIR /app
# Just remembers this in the image metadata; doesn't actually run it
CMD ["/app/main.sh"]
# ...we should actually copy the file in too
COPY main.sh /app

当您使用一个Dockerfile构建另一个镜像时,它几乎完全像您运行了第一个Dockerfile中的所有命令,然后再运行第二个Dockerfile中的所有命令。由于CMD和ENTRYPOINT只设置元数据,因此第二个镜像继承了这些元数据。
构建和运行镜像是两个独立的步骤。在您展示的示例中,COPY指令发生在docker build步骤期间,基本镜像的命令直到稍后的docker run步骤才生效。(这也适用于Docker Compose;一个常见问题是为什么Dockerfile步骤无法连接到在Compose YAML文件中声明的其他容器。)
有一个例外情况,与ENTRYPOINT有关。如果您有一个声明了ENTRYPOINT和CMD的基本镜像,并且您在派生镜像中重新声明了ENTRYPOINT,则它也会重置CMD(本节的最后一段)。这通常不是实际问题。

0

当您构建一个镜像时,Dockerfile会根据其指令进行合并。构建镜像并不意味着它可以运行。因此,您的基础Dockerfile和当前Dockerfile中的指令将被打包。由于您在基础Dockerfile中提到了CMD入口点,当您使用docker run时,它将用于在容器内执行镜像。
因此,当您构建镜像时,来自子Dockerfile的COPY语句也将被设置,并且您的镜像必须构建成功。 执行您的docker builddocker run,然后让我们知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接