运行docker build时,EXPOSE和CMD被忽略。

6
我将尝试通过运行 docker build 来创建一个 Docker 镜像。 以下是我的 Dockerfile 中的代码。
FROM node

WORKDIR /app

COPY . /app

RUN npm install

EXPOSE 80

CMD ["node", "server.js"]

但我只能获得到 RUN 命令之前的日志:

 => [internal] load build definition from Dockerfile                                                                   0.1s 
 => => transferring dockerfile: 128B                                                                                   0.0s 
 => [internal] load .dockerignore                                                                                      0.0s 
 => => transferring context: 2B                                                                                        0.0s 
 => [internal] load metadata for docker.io/library/node:latest                                                         0.0s 
 => [1/4] FROM docker.io/library/node                                                                                  0.0s 
 => [internal] load build context                                                                                      0.1s 
 => => transferring context: 14.62kB                                                                                   0.0s 
 => CACHED [2/4] WORKDIR /app                                                                                          0.0s 
 => [3/4] COPY . /app                                                                                                  0.1s 
 => [4/4] RUN npm install                                                                                              5.0s 
 => exporting to image                                                                                                 0.3s 
 => => exporting layers                                                                                                0.2s 
 => => writing image sha256:b7949d3a83e365d0c55690d4fd5c6d9f0e0e20fe88c53aebc3e33b067e600231                           0.0s

我希望EXPOSE和CMD与其它4行命令一样有效。为了实现这一点,我应该在哪里检查?非常感谢您的帮助!

2个回答

9

EXPOSE指令并不会真正发布端口(我加粗的是关键点):

EXPOSE指令告诉Docker容器在运行时监听指定的网络端口。您可以指定端口是TCP还是UDP,如果未指定协议,则默认为TCP。

EXPOSE指令实际上并不会发布端口 。它作为构建镜像的人和运行容器的人之间的一种文档类型,用于指明哪些端口应该被发布。要在运行容器时实际发布端口,请使用docker run命令中的-p标志来发布和映射一个或多个端口,或使用-P标志将所有已公开的端口都发布并映射到高序端口。

在运行容器时,您应该使用-p选项以实际发布和映射端口。例如:

docker run [params] -p 8080:9090 image

1
Buildkit没有记录这些步骤的任何内容,尽管它仍然执行了它们。很可能他们选择不记录该步骤,因为没有创建文件系统更改,只有一些元数据被调整。 EXPOSE、CMD以及其他步骤(如ENTRYPOINT、LABEL和ENV)的结果是更改图像的json配置。

此配置与镜像一起提供,并告诉运行时容器的默认值。在创建容器时可以覆盖许多这些默认值,例如命令和入口点。对于公开的端口,它特别说明了容器内默认正在侦听哪些端口。

要查看经典构建工具的输出,可以通过设置环境变量来禁用buildkit:

DOCKER_BUILDKIT=0 docker build ...

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