Dockerfile
Dockerfile 是一个文本文件,包含了一系列指令,用于自动化构建 Docker 镜像。每个指令对应一个镜像层,最终生成一个可运行的容器镜像。以下是 Dockerfile 的详细解析:
1. FROM
- 作用: 指定基础镜像。
- 语法:
FROM <image>[:<tag>] [AS <name>]
- 示例:
FROM ubuntu:20.04
-
- 使用
ubuntu:20.04
作为基础镜像。 AS <name>
可用于多阶段构建,给阶段命名。
- 使用
2. LABEL
- 作用: 添加元数据到镜像。
- 语法:
LABEL <key>=<value> <key>=<value> ...
- 示例:
LABEL version="1.0" description="This is a sample Dockerfile"
3. RUN
- 作用: 在镜像构建过程中执行命令。
- 语法:
RUN <command>
或RUN ["executable", "param1", "param2"]
- 示例:
RUN apt-get update && apt-get install -y curl
4. CMD
- 作用: 指定容器启动时默认执行的命令。
- 语法:
CMD ["executable","param1","param2"]
或CMD command param1 param2
- 示例:
CMD ["python", "app.py"]
-
- 如果 Dockerfile 中有多个
CMD
,只有最后一个生效。
- 如果 Dockerfile 中有多个
5. ENTRYPOINT
- 作用: 配置容器启动时执行的命令,与
CMD
类似,但更优先。 - 语法:
ENTRYPOINT ["executable", "param1", "param2"]
或ENTRYPOINT command param1 param2
- 示例:
ENTRYPOINT ["python", "app.py"]
-
ENTRYPOINT
和CMD
可以结合使用,CMD
作为ENTRYPOINT
的参数。
6. COPY
- 作用: 将文件或目录从主机复制到镜像中。
- 语法:
COPY <src> <dest>
- 示例:
COPY . /app
-
- 将当前目录下的所有文件复制到镜像中的
/app
目录。
- 将当前目录下的所有文件复制到镜像中的
7. ADD
- 作用: 类似于
COPY
,但支持自动解压和远程 URL。 - 语法:
ADD <src> <dest>
- 示例:
ADD https://example.com/file.tar.gz /app
-
- 自动下载并解压文件到
/app
目录。
- 自动下载并解压文件到
8. ENV
- 作用: 设置环境变量。
- 语法:
ENV <key>=<value> ...
- 示例:
ENV NODE_ENV=production
9. ARG
- 作用: 定义构建时的变量,仅在构建过程中有效。
- 语法:
ARG <name>[=<default value>]
- 示例:
ARG version=1.0
10. WORKDIR
- 作用: 设置工作目录,后续命令在该目录下执行。
- 语法:
WORKDIR /path/to/workdir
- 示例:
WORKDIR /app
11. EXPOSE
- 作用: 声明容器运行时监听的端口。
- 语法:
EXPOSE <port> [<port>/<protocol>...]
- 示例:
EXPOSE 80
12. VOLUME
- 作用: 创建挂载点,用于持久化数据。
- 语法:
VOLUME ["/data"]
- 示例:
VOLUME /var/log
13. USER
- 作用: 指定运行容器时的用户。
- 语法:
USER <user>[:<group>]
- 示例:
USER nobody
14. HEALTHCHECK
- 作用: 定义容器健康检查。
- 语法:
HEALTHCHECK [OPTIONS] CMD <command>
- 示例:
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
15. ONBUILD
- 作用: 定义触发器,当该镜像作为基础镜像时,触发器会在子镜像构建时执行。
- 语法:
ONBUILD <INSTRUCTION>
- 示例:
ONBUILD COPY . /app
16. STOPSIGNAL
- 作用: 设置停止容器时发送的系统调用信号。
- 语法:
STOPSIGNAL <signal>
- 示例:
STOPSIGNAL SIGTERM
17. SHELL
- 作用: 指定
RUN
、CMD
和ENTRYPOINT
使用的默认 shell。 - 语法:
SHELL ["executable", "parameters"]
- 示例:
SHELL ["/bin/bash", "-c"]
示例 Dockerfile
# 使用官方的 Python 3.9 镜像作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录下的所有文件到工作目录
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 设置环境变量
ENV FLASK_APP=app.py
# 暴露端口
EXPOSE 5000
# 运行应用
CMD ["flask", "run", "--host=0.0.0.0"]
总结
Dockerfile 通过一系列指令定义了镜像的构建过程。理解每个指令的作用和用法,可以帮助你编写高效的 Dockerfile,构建出符合需求的 Docker 镜像。