Dockerfile
基础指令
FROM:指定构建镜像的基础镜像
FROM 指令是 Dockerfile 的第一条指令,并且每个 Dockerfile 必须有一个 FROM
语法:FROM <镜像名>:<标签>
例子:FROM ubuntu:20.04
MAINTAINER / LABEL:用于指定镜像维护者的信息
语法:MAINTAINER <name>
例子:MAINTAINER John Doe <john@example.com>
例子:LABEL maintainer="John Doe john@example.com"
RUN:在构建镜像时执行命令,每个 RUN 创建一个新的镜像层
语法:RUN <命令>
例子:RUN apt-get update && apt-get install -y curl
CMD:指定容器启动时要执行的默认命令
CMD 可以被 docker run 的命令覆盖
语法:CMD ["可执行文件", "参数1", "参数2"]
例子:CMD ["node", "app.js"]
这条指令表示容器启动时会运行 node app.js,如果在运行容器时提供了其他命令,该指令会被覆盖
EXPOSE:声明容器应用程序使用的端口,用于文档化用途,并不自动映射到宿主机端口
语法:EXPOSE <端口号>
例子:EXPOSE 8080
ENV:定义环境变量,允许在 Docker 容器内访问这些变量
语法:ENV <key>=<value>
例子:ENV NODE_ENV=production
ADD:将文件或目录从构建上下文复制到容器内,并且可以处理远程 URL 和解压 .tar 文件
语法:ADD <源路径> <目标路径>
例子:ADD ./app.tar.gz /usr/src/app/
这条指令会将 app.tar.gz 文件添加到容器的 /usr/src/app 目录,并自动解压
COPY:与 ADD 类似,但只能从本地系统复制文件或目录,不能处理远程 URL,也不能自动解压缩
语法:COPY <源路径> <目标路径>
例子:COPY . /usr/src/app
这条指令将当前目录下的所有文件和目录复制到容器的 /usr/src/app 目录
ENTRYPOINT:配置容器启动时运行的主进程,与 CMD 类似,但 ENTRYPOINT 指定的命令不会被 docker run 覆盖
语法:ENTRYPOINT ["可执行文件", "参数1", "参数2"]
例子:ENTRYPOINT ["nginx", "-g", "daemon off;"]
这条指令表示容器启动时会运行 nginx 并且在前台运行,不会以守护进程模式(daemon)启动
VOLUME:声明数据卷,用于容器和宿主机之间的数据共享或持久化
语法:VOLUME ["/数据/目录"]
例子:VOLUME ["/var/www/html"]
USER:指定运行容器时使用的用户,默认是 root
语法:USER <用户名或UID>
例子:USER node
WORKDIR:设置容器内的工作目录,相当于 cd 到某个目录,之后的 RUN, CMD, ENTRYPOINT 都会在该目录下执行
语法:WORKDIR <路径>
例子:WORKDIR /usr/src/app
这条指令将 /usr/src/app 设为工作目录,后续指令都将在该目录下运行
HEALTHCHECK:定义容器的健康检查,用于判断容器是否在正常工作
语法:HEALTHCHECK [选项] CMD <命令>
例子:HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1
这条指令定义了一个健康检查,容器每隔 30 秒检查一次 http://localhost/,如果检查失败则容器会被标记为不健康
ARG:定义构建时使用的变量,允许通过 docker build --build-arg 传递参数
语法:ARG <变量名>[=<默认值>]
ARG VERSION=1.0
RUN echo "Building version $VERSION"
# 这条指令定义了构建时的 VERSION 变量,默认值为 1.0,可以通过 docker build --build-arg VERSION=2.0 来覆盖
2
3
Dockerfile 完整实例
# 从 Python 3.8 的官方镜像开始构建
FROM python:3.8-slim
# 维护者信息
LABEL maintainer="John Doe <john@example.com>"
# 设置构建时的版本参数
ARG APP_VERSION=1.0
# 设置环境变量
ENV APP_HOME /app
ENV APP_VERSION=${APP_VERSION}
# 设置工作目录
WORKDIR ${APP_HOME}
# 复制当前目录的文件到工作目录
COPY . .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 5000
# 定义容器启动时的命令
CMD ["python", "app.py"]
# 健康检查
HEALTHCHECK CMD curl -f http://localhost:5000/ || exit 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30