Dockerfile
学习在 Dockerfile 中可以使用的指令。
Dockerfile
Dockerfile 是一个纯文本文件,用于描述构建镜像的步骤,通常用于您自己的应用程序。要从当前目录中的 Dockerfile 构建 Docker 镜像,请输入:
1docker image build -t <镜像名称> .
命令末尾的句点表示当前目录。若需使用其他路径或文件名,可附加 -f <文件> 参数。
以下命令使用频率最高。
# 注释
以 # 开头的行表示注释:
1#我的注释
ARG 参数
可以通过 --build-arg <名称>=<值> 选项在构建时传递变量。通过 ARG 语句导入该值:
1# 获取 myvar 2ARG myvar
若未传入值,可定义默认值:
1# 获取 myvar,默认值为 "myimage" 2ARG myvar=myimage
在其他地方使用该值时,需在前面加上 $ 符号:
1RUN echo $myvar
当值需要嵌入字符串中时,可以使用 ${name} 形式的替换:
1FROM ${myvar}:latest
ENV 环境变量
设置环境变量:
1ENV HOME=/home/app
在其他地方使用该值时,可通过在前面加 $ 或 ${} 来引用:
1RUN echo $HOME 2RUN echo ${HOME}
FROM <镜像> 起始镜像
使用现有镜像作为起点创建新镜像。这通常是 Dockerfile 中的第一条命令:
1# Alpine Linux 上的最新 Node LTS 版本 2FROM node:lts-alpine
WORKDIR 工作目录
设置后续 COPY、ADD、RUN、CMD 和 ENTRYPOINT 指令的工作目录:
1WORKDIR /home/myapp
COPY 从主机复制文件到镜像
支持使用文件模式:
1# 将所有文件复制到当前目录 2COPY . . 3 4# 将所有 txt 文件复制到 /doc/ 目录 5COPY *.txt /doc/ 6 7# 将所有文件复制并指定用户和组的所有权 8#(仅限 Linux 容器) 9COPY . .
ADD 添加文件
ADD 与 COPY 类似,但还支持使用 URL 和 tar 文件作为源。虽然这可能有用,但使用 RUN 链式调用 curl 和 tar 命令通常能生成更小、层数更少的 Docker 镜像。
挂载 VOLUME
通过创建挂载点,可以使文件和文件夹对其他容器可见。例如,以下示例中,/data/myvol 文件夹中的数据也可被网络中的其他容器访问:
1RUN mkdir -p /data/myvol 2VOLUME /data/myvol
可指定多个卷或挂载点:
1VOLUME /myvol1 /myvol2 /myvol3
示例用途:如果您正在将 Node.js 应用程序提供给 NGINX,并希望与 NGINX 共享部分 Node.js 文件,可以在 Node.js 容器中挂载客户端的 HTML、CSS、JavaScript 和媒体文件到一个 static 文件夹。这样,这些文件就可以由另一个容器中运行的 NGINX Web 服务器直接提供。
设置 USER
定义用于 RUN、CMD 和 ENTRYPOINT 指令的用户(可选地包括组):
1USER myuser
RUN 运行命令
RUN 在构建过程中执行指令,如安装或配置命令。Dockerfile 中可包含任意数量的 RUN 命令。
使用 shell 形式执行命令:
1RUN npm install
或使用 exec(数组)形式直接运行可执行文件,这是推荐方式:
1RUN ["npm", "install"]
📌
Exec形式能正确接收 Unix 信号(如终止信号)。它是最常用的方式,也推荐优于Shell形式。Shell形式省略了复杂的数组语法,Docker 会通过命令壳(shell)执行命令,前缀为/bin/sh -c,因此实际运行的是/bin/sh -c node ./index.js。应避免使用这种形式,因为它不会将信号传递给子进程,可能导致服务器终止时出现问题。
EXPOSE 暴露端口
通知 Docker 容器将在指定的网络端口上监听。注意,暴露的端口必须在使用 docker run 时通过 -p 发布:
1EXPOSE 3000
CMD 执行容器
CMD 设置默认的应用启动指令,当使用 docker run 启动容器时未指定命令时生效。Dockerfile 中只允许一条 CMD,因此只有最后一条会被处理。
命令可使用 shell 形式:
1CMD node ./index.js
或使用 exec(数组)形式直接运行可执行文件:
1CMD ["node", "/index.js"]
通常情况下,使用 CMD 提供一个默认命令,可在启动容器时通过命令行覆盖。
ENTRYPOINT 执行容器
ENTRYPOINT 设置构建可执行 Docker 镜像时的启动指令。容器启动时应用将运行。Dockerfile 中只允许一条 ENTRYPOINT,它会覆盖任何 CMD 指令。
命令可使用 shell 形式:
1ENTRYPOINT node ./index.js
或使用 exec(数组)形式——推荐方式——直接运行可执行文件:
1ENTRYPOINT ["node", "/index.js"]
.dockerignore 文件模式
.dockerignore 文件指定在使用 COPY 和 ADD 时应忽略的文件名模式。例如:
1Dockerfile 2docker*.yml 3 4.git 5.gitignore 6.config 7 8.npm 9.vscode 10node_modules 11 12README.md
练习
上述讨论的 Dockerfile 如下所示。对于名为 myimage 的镜像,您可以使用以下命令进行构建:
1docker image build -t myimage .
查看您的镜像,请使用:
1docker images
No configuration found for ID: e1bad28773425e7a8826b4109539113061ab44b934abe33492cc45da6281f253