仅来自基础映像的具有入口点的 Dockerfile
Dockerfile with entrypoint only from base image
我有一个非常简单的 Dockerfile,如下所示:-
FROM my-base-image
COPY abc.properties /opt/conf/
现在我的基础镜像有一个 docker 入口点(在它的 Dockerfile 的末尾)但是你可以看到这个生成的镜像有 none。这行得通吗,或者我们是否需要在任何给定的 Dockerfile 中有一个 docker entrypoint/CMD。另外,结果图像中 COPY 指令的执行顺序是什么。我的意思是,因为这个 Dockerfile 没有入口点,所以它会从基础镜像执行一个入口点,但是它将在 COPY 指令之后执行,或者是先执行基础镜像入口点,然后在容器启动时执行这个 COPY 指令
只是在 docker.
中寻找概念
构建映像时,Dockerfile 会按照它们的说明进行合并。构建图像并不意味着它可以运行。因此,理想情况下,来自 Base Dockerfile 和当前 Dockerfile 的指令将被打包。由于您在基本 Dockerfile 中提到了 CMD
入口点,当您使用 docker run
.
时,它将用于在容器内执行您的图像
因此,当您构建镜像时,子 Dockerfile 中的 COPY 语句也将被设置。并且您的图像必须构建良好。
执行您的 docker build
和 docker run
并让我们知道
几个 Docker 文件指令(特别是 ENTRYPOINT 和 CMD,还有 EXPOSE、LABEL 和 MAINTAINER)只是在映像中设置元数据;他们自己什么都不做。在单个 Docker 文件中,这将正常工作:
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
当你有一个 Docker 文件从另一个图像构建时,它的行为几乎完全像你 运行 第一个 Docker 文件中的所有命令,然后是第二个 Docker 文件。由于CMD和ENTRYPOINT只是设置了元数据,所以第二张图片继承了这个元数据。
构建和运行图像是两个独立的步骤。在您显示的示例中, COPY 指令发生在 docker build
步骤期间,并且基本图像的命令直到后面的 docker run
步骤才会生效。 (这在 Docker Compose 中也是如此;一个常见的问题是为什么 Docker 文件步骤无法连接到 Compose YAML 文件中声明的其他容器。)
有一个例外,它在 ENTRYPOINT 附近。如果您有一个同时声明了 ENTRYPOINT 和 CMD 的基础映像,并且您在派生映像中重新声明了 ENTRYPOINT,it resets the CMD as well(本节的最后一段)。这通常不是实际问题。
我有一个非常简单的 Dockerfile,如下所示:-
FROM my-base-image
COPY abc.properties /opt/conf/
现在我的基础镜像有一个 docker 入口点(在它的 Dockerfile 的末尾)但是你可以看到这个生成的镜像有 none。这行得通吗,或者我们是否需要在任何给定的 Dockerfile 中有一个 docker entrypoint/CMD。另外,结果图像中 COPY 指令的执行顺序是什么。我的意思是,因为这个 Dockerfile 没有入口点,所以它会从基础镜像执行一个入口点,但是它将在 COPY 指令之后执行,或者是先执行基础镜像入口点,然后在容器启动时执行这个 COPY 指令 只是在 docker.
中寻找概念构建映像时,Dockerfile 会按照它们的说明进行合并。构建图像并不意味着它可以运行。因此,理想情况下,来自 Base Dockerfile 和当前 Dockerfile 的指令将被打包。由于您在基本 Dockerfile 中提到了 CMD
入口点,当您使用 docker run
.
时,它将用于在容器内执行您的图像
因此,当您构建镜像时,子 Dockerfile 中的 COPY 语句也将被设置。并且您的图像必须构建良好。
执行您的 docker build
和 docker run
并让我们知道
几个 Docker 文件指令(特别是 ENTRYPOINT 和 CMD,还有 EXPOSE、LABEL 和 MAINTAINER)只是在映像中设置元数据;他们自己什么都不做。在单个 Docker 文件中,这将正常工作:
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
当你有一个 Docker 文件从另一个图像构建时,它的行为几乎完全像你 运行 第一个 Docker 文件中的所有命令,然后是第二个 Docker 文件。由于CMD和ENTRYPOINT只是设置了元数据,所以第二张图片继承了这个元数据。
构建和运行图像是两个独立的步骤。在您显示的示例中, COPY 指令发生在 docker build
步骤期间,并且基本图像的命令直到后面的 docker run
步骤才会生效。 (这在 Docker Compose 中也是如此;一个常见的问题是为什么 Docker 文件步骤无法连接到 Compose YAML 文件中声明的其他容器。)
有一个例外,它在 ENTRYPOINT 附近。如果您有一个同时声明了 ENTRYPOINT 和 CMD 的基础映像,并且您在派生映像中重新声明了 ENTRYPOINT,it resets the CMD as well(本节的最后一段)。这通常不是实际问题。