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 python3CMD
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/directoryWORKDIR /usr/src/appCOPY
COPY 指令用于将文件或目录从本地文件系统复制到镜像中的指定路径。相对于 ADD 指令,COPY 更简单,不会自动解压文件。
COPY <src> <dest>COPY . /usr/src/appADD
ADD 指令与 COPY 类似,但它还具备解压 tar 文件以及从 URL 复制文件的能力。
ADD <src> <dest>ADD https://example.com/file.tar.gz /usr/src/appEXPOSE
EXPOSE 指令用于声明容器在运行时监听的端口。这个声明不会自动开放端口,它只是一个标识,实际端口映射需要在 docker run 时通过 -p 参数指定。
EXPOSE <port>EXPOSE 8080ENV
ENV 指令用于设置环境变量。该变量将在容器的所有后续指令中可用。
ENV <key>=<value>ENV NODE_ENV=productionVOLUME
VOLUME 指令用于在容器中创建一个挂载点。通过 VOLUME,你可以在容器运行时将本地目录或数据卷挂载到指定路径。
VOLUME ["/data"]VOLUME ["/var/log/app"]USER
USER 指令用于指定后续命令以哪个用户的身份执行。如果不指定,默认是 root 用户。
USER <username>USER nodeARG
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 1STOPSIGNAL
STOPSIGNAL 指令用于指定停止容器时发送给主进程的系统信号。默认是 SIGTERM。
STOPSIGNAL signalSTOPSIGNAL SIGKILLONBUILD
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 官方镜像作为基础镜像,并包含应用目录的创建、依赖安装、应用代码复制和端口暴露等操作。