Dockerfile的编写

什么是 Dockerfile?

Dockerfile 是一系列命令和指令的集合,用于定义如何从零开始构建 Docker 镜像。通过执行 docker build 命令,Docker 会读取 Dockerfile 中的指令,并按照顺序逐步构建镜像。

Dockerfile 的基本结构和步骤通常包括选择基础镜像、安装依赖、复制文件、设置环境变量、执行命令等。

Dockerfile 的基本结构

一个典型的 Dockerfile 可能包含以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 选择基础镜像
FROM ubuntu:20.04

# 2. 设置维护者信息
LABEL maintainer="your_email@example.com"

# 3. 更新镜像并安装软件包
RUN apt-get update && apt-get install -y nginx

# 4. 复制本地文件到镜像中
COPY ./index.html /usr/share/nginx/html/index.html

# 5. 设置环境变量
ENV APP_ENV=production

# 6. 暴露端口
EXPOSE 80

# 7. 设置容器启动命令
CMD ["nginx", "-g", "daemon off;"]

常用的 Dockerfile 指令

1. FROM

FROM 指令用于指定构建镜像时的基础镜像。每个 Dockerfile 必须以 FROM 开头,因为它告诉 Docker 从哪个镜像开始构建。

语法:

1
FROM <image_name>[:<tag>]

示例:

1
FROM ubuntu:20.04

这个指令表示从 ubuntu:20.04 镜像开始构建新的镜像。

2. LABEL

LABEL 指令用于为镜像添加元数据,如维护者信息、版本等。LABEL 是键值对的形式,可以添加多个 LABEL

语法:

1
LABEL <key>=<value>

示例:

1
LABEL maintainer="your_email@example.com"

这条指令为镜像添加了维护者信息。

3. RUN

RUN 指令用于在镜像构建时执行命令。常用于安装软件包、更新系统等操作。每一条 RUN 指令都会创建一个新的镜像层。

语法:

1
RUN <command>

示例:

1
RUN apt-get update && apt-get install -y nginx

此命令会在镜像中安装 Nginx。

4. COPY

COPY 指令用于将本地文件或目录复制到镜像中。COPY 是一个非常常用的指令,用于将应用程序代码、配置文件等从主机复制到镜像。

语法:

1
COPY <src> <dest>

示例:

1
COPY ./index.html /usr/share/nginx/html/index.html

这条指令会将当前目录下的 index.html 文件复制到镜像中的指定位置。

5. ADD

ADD 指令与 COPY 类似,也是用于将本地文件或目录复制到镜像中。但与 COPY 不同,ADD 还可以解压 tar 文件,并支持从 URL 下载文件。

语法:

1
ADD <src> <dest>

示例:

1
ADD ./archive.tar.gz /path/in/container

这条指令会将 archive.tar.gz 文件解压并复制到指定路径。

6. ENV

ENV 指令用于设置环境变量。环境变量在容器运行时可用,且可以通过应用程序访问。

语法:

1
ENV <key>=<value>

示例:

1
ENV APP_ENV=production

这条指令设置了 APP_ENV 环境变量为 production

7. EXPOSE

EXPOSE 指令用于告诉 Docker
容器运行时将会使用哪些端口。该指令仅仅是文档化和约定,容器实际运行时并不会开放这些端口,除非在运行时通过 -p 选项进行端口映射。

语法:

1
EXPOSE <port>

示例:

1
EXPOSE 80

这条指令表示容器会监听 80 端口。

8. CMD

CMD 指令用于指定容器启动时的默认命令。如果用户没有在运行容器时指定命令,则会执行 CMD 中的命令。

语法:

1
CMD ["executable", "param1", "param2"]

示例:

1
CMD ["nginx", "-g", "daemon off;"]

这条指令表示容器启动时默认运行 Nginx 服务,并且使其在前台运行。

9. ENTRYPOINT

ENTRYPOINT 指令和 CMD 类似,都是用于指定容器启动时执行的命令。不同的是,ENTRYPOINT 通常与 CMD
一起使用,并且 ENTRYPOINT 指定的命令不可被覆盖。

语法:

1
ENTRYPOINT ["executable", "param1", "param2"]

示例:

1
ENTRYPOINT ["python", "app.py"]

这条指令表示容器启动时执行 python app.py

如何编写 Dockerfile

编写 Dockerfile 时,一般遵循以下步骤:

  1. 选择基础镜像:根据你的应用需求选择合适的基础镜像。例如,如果你要构建一个 Python 应用,可以选择 python 镜像;如果是
    Web 应用,可以选择 nginxubuntu 等。

  2. 安装依赖:使用 RUN 指令安装应用所需要的依赖或工具。尽量合并多个 RUN 指令来减少镜像层数。

  3. 复制文件:将项目代码、配置文件等复制到镜像中的合适位置,通常使用 COPYADD 指令。

  4. 设置环境变量:使用 ENV 指令设置必要的环境变量。

  5. 配置容器的行为:使用 EXPOSE 指令暴露端口,使用 CMDENTRYPOINT 指定容器启动时执行的命令。

  6. 构建镜像:完成 Dockerfile 编写后,使用 docker build 命令构建镜像,并运行 docker run 来启动容器。