docker - 仅来自基本映像的入口点的 Dockerfile
问题描述
我有一个非常简单的 Dockerfile,如下所示:-
FROM my-base-image
COPY abc.properties /opt/conf/
现在我的基础镜像有一个 docker 入口点(在它的 Dockerfile 的末尾),但是你可以看到这个生成的镜像没有。这是否有效,或者我们是否需要在任何给定的 Dockerfile 中有一个 docker 入口点/CMD。此外,结果图像中 COPY 指令的执行顺序是什么。我的意思是,由于这个 Dockerfile 没有入口点,它会从基本映像执行一个,但会在 COPY 指令之后执行,或者会先执行基本映像入口点,然后在容器启动时执行此 COPY 指令只是寻找概念在码头工人。
解决方案
一些 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 和 CMD 的基本映像,并且您在派生映像中重新声明了 ENTRYPOINT,它也会重置 CMD(本节的最后一段)。这通常不是一个实际问题。
推荐阅读
- javascript - 如何将变量从反应发送到节点
- c# - 如何从.ascx.cs中提取asp .net控件(文本框)到另一个类并更改控件属性
为真 - javascript - 运行 React 应用程序时获取有关加载程序的编译错误
- python - 查找值与另一行设置的条件匹配的第一行的索引
- python - 无法从 web 服务 entry_script 中加载 azure.ml 工作区!`/var/azureml-app/` 位于哪里?
- winhttp - WinHTTP GET 请求不会在 Google Analytics 中触发
- android - 实时数据库从不安全规则到安全规则,无需中断服务
- sql - Oracle SQL Developer - 在特定日期内分组和计数
- python - 类型错误:无法理解数据类型并尝试使用其他类的方法
- reactjs - 如何在反应中动态路由