DockerFile 文件详解
FROM
FROM
指令用于指定基础镜像。每个 Dockerfile
都必须以 FROM
开头,它定义了该镜像基于哪个现有的镜像。
FROM <image>[:<tag>]
FROM ubuntu:20.04
这个例子表示镜像基于 ubuntu
的 20.04 版本。
LABEL
LABEL
指令用于给镜像添加元数据。它们以键值对的形式存储,通常用于说明镜像信息或管理工具标记。
LABEL <key>=<value> <key>=<value> ...
LABEL maintainer="yourname@example.com"
RUN
RUN
指令用于在构建镜像时执行命令,通常用于安装软件包或配置系统。每次 RUN
都会创建一个新的镜像层
RUN <command>
RUN apt-get update && apt-get install -y python3
CMD
CMD
指令用于指定容器启动时要运行的命令或脚本。它可以在 docker run
时被覆盖
CMD ["executable", "param1", "param2"]
CMD ["python3", "app.py"]
ENTRYPOINT
ENTRYPOINT
与 CMD
类似,但更适合作为容器的主命令,不能轻易被 docker run
覆盖。
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT ["python3", "app.py"]
WORKDIR
WORKDIR
指令用于设置工作目录,后续的 RUN
、CMD
、ENTRYPOINT
等指令都会在该目录下执行。
WORKDIR /path/to/directory
WORKDIR /usr/src/app
COPY
COPY
指令用于将文件或目录从本地文件系统复制到镜像中的指定路径。相对于 ADD
指令,COPY
更简单,不会自动解压文件。
COPY <src> <dest>
COPY . /usr/src/app
ADD
ADD
指令与 COPY
类似,但它还具备解压 tar 文件以及从 URL 复制文件的能力。
ADD <src> <dest>
ADD https://example.com/file.tar.gz /usr/src/app
EXPOSE
EXPOSE
指令用于声明容器在运行时监听的端口。这个声明不会自动开放端口,它只是一个标识,实际端口映射需要在 docker run
时通过 -p
参数指定。
EXPOSE <port>
EXPOSE 8080
ENV
ENV
指令用于设置环境变量。该变量将在容器的所有后续指令中可用。
ENV <key>=<value>
ENV NODE_ENV=production
VOLUME
VOLUME
指令用于在容器中创建一个挂载点。通过 VOLUME
,你可以在容器运行时将本地目录或数据卷挂载到指定路径。
VOLUME ["/data"]
VOLUME ["/var/log/app"]
USER
USER
指令用于指定后续命令以哪个用户的身份执行。如果不指定,默认是 root 用户。
USER <username>
USER node
ARG
ARG
指令用于定义在构建时可传递的参数。与 ENV
不同,ARG
的作用范围仅限于构建时。
ARG <name>[=<default value>]
ARG VERSION=1.0
RUN echo "Building version $VERSION"
SHELL
SHELL
指令用于指定 RUN
命令执行的 shell。默认是 /bin/sh -c
。
SHELL ["executable", "parameters"]
SHELL ["/bin/bash", "-c"]
HEALTHCHECK
HEALTHCHECK
指令用于设置容器的健康检查。Docker 将定期执行指定的命令检查容器的健康状况。
HEALTHCHECK [OPTIONS] CMD <command>
HEALTHCHECK CMD curl --fail http://localhost:8080/health || exit 1
STOPSIGNAL
STOPSIGNAL
指令用于指定停止容器时发送给主进程的系统信号。默认是 SIGTERM
。
STOPSIGNAL signal
STOPSIGNAL SIGKILL
ONBUILD
ONBUILD
指令用于在生成基础镜像时定义触发器。这些指令不会在镜像构建时运行,但在基于该镜像创建新镜像时会触发执行。
ONBUILD <instruction>
ONBUILD RUN echo "This will run on child builds"
EXAMPLES
一个简单的 Node.js 应用的 Dockerfile 示例
# 使用官方的 Node.js 作为基础镜像
FROM node:14
# 创建应用目录
WORKDIR /usr/src/app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 暴露应用端口
EXPOSE 8080
# 定义启动命令
CMD ["node", "app.js"]
这个 Dockerfile
使用 Node.js 官方镜像作为基础镜像,并包含应用目录的创建、依赖安装、应用代码复制和端口暴露等操作。