我有一个非常简单的Dockerfile,如下所示:-
FROM my-base-image
COPY abc.properties /opt/conf/
现在,我的基本映像具有一个docker入口点(在其Dockerfile的末尾),但是您看到的此结果映像没有。这是可行的还是我们需要在任何给定的Dockerfile中都有一个Docker入口点/ CMD。在结果图像中,COPY指令的执行顺序也是什么。我的意思是,由于此Dockerfile没有入口点,它将从基本映像执行一个入口,但将在COPY指令之后执行,或者将首先执行基本映像入口点,然后在容器启动时执行此COPY指令 只是在docker中寻找概念。
答案 0 :(得分:1)
几个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,则it resets the CMD as well(本节的最后一段)。这通常不是实际问题。
答案 1 :(得分:0)
构建映像时,Dockerfile将按照其说明进行合并。构建映像并不意味着它可以运行。因此,理想情况下,将打包来自基本Dockerfile和当前Dockerfile的指令。既然您在基础Dockerfile中提到了CMD
入口点,那么当您使用docker run
时,它将用于在容器内执行映像。
因此,在构建映像时,子Dockerfile的COPY语句也会被设置。并且您的图像必须构建良好。
执行您的docker build
和docker run
并告诉我们