old dockerfile
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
EXPOSE 3000
# syntax=docker/dockerfile:1
是 Dockerfile 的一个解析器指令,它用于声明构建时使用的 Dockerfile 语法版本。如果你不指定这个指令,BuildKit 将使用它内置的 Dockerfile 前端版本。声明一个语法版本可以让你自动使用最新的 Dockerfile 版本,而无需升级 BuildKit 或 Docker Engine,甚至可以使用自定义的 Dockerfile 实现。
大多数用户会将这个解析器指令设置为
docker/dockerfile:1
,这会让 BuildKit 在构建前拉取 Dockerfile 语法的最新稳定版本。在你的 Dockerfile 中,
# syntax=docker/dockerfile:1
指令告诉 Docker 使用最新稳定版本的 Dockerfile 语法来解析和构建这个 Dockerfile。
note 1 :
EXPOSE 3000 和 docker run -dp 127.0.0.1:3001:3000 getting-started-2 的关联
Dockerfile 中的
EXPOSE
指令只是声明了应用程序在容器内部监听的端口,它并不会自动映射这个端口到宿主机。如果你想让应用程序可以从宿主机访问,你需要在启动容器时使用-p
或--publish
参数来映射端口。容器启动时映射的端口并不一定要和
EXPOSE
指令声明的端口相同。例如,你的 Dockerfile 中有EXPOSE 3000
,但你可以在启动容器时使用-p xxxx:3000
来将容器的 3000 端口映射到宿主机的 xxxx 端口。但是,如果你的应用程序在容器内部监听的端口和
EXPOSE
指令声明的端口不同,那么EXPOSE
指令就没有意义了。因为EXPOSE
指令的主要目的就是告诉使用这个镜像的人,应用程序在哪个端口提供服务。镜像就是一个模版,可以同时生成多个容器实例服务这样就相当于你可以将启动多个主机端口 映射同样的实例服务
3001 -> 3000 3002 -> 3000
note 2 : caching of the dependencies
watching the old dockerFile command line 。 at some circumstance , we will recreated image when update code ,but it will download dependencies again