Dockerfile 是一个使用 Docker 平台自动生成容器的脚本。它本质上是一个文本文档,包含用户从命令行创建镜像所需的所有指令。Docker 平台是一个基于 Linux 的平台,允许开发人员创建和执行容器、独立程序以及独立于底层基础设施的系统。Docker 基于 Linux内核的资源隔离功能,允许开发人员和系统管理员通过在容器内执行程序来实现跨系统和机器的程序传输。
借助 Dockerfiles,Docker 容器可以在任何 Linux 主机上运行。Docker镜像用于构建应用程序的容器环境,可以手动生成,也可以使用 Dockerfiles 自动生成。Docker 容器可以执行 Linux 和Windows 应用程序。开发人员可以使用 Dockerfiles 构建自动化容器构建,该构建过程会逐步执行一系列命令行指令。Docker 容器化本质上是操作系统级别的虚拟化。由于没有虚拟机的启动开销,多个独立容器可以在单个 Linux 实例中运行。
编写 Dockerfile 的语法和格式
1. FROM
FROM 语句定义要下载并从哪个镜像开始运行。它必须是 Dockerfile 中的第一个命令。一个 Dockerfile 可以包含多个 FROM 语句,这意味着 Dockerfile 会生成多个镜像。
例子:
FROM java: 8
2.维护者
这个声明是一种文档,它定义了谁创建了这个 Dockerfile 或者如果它有错误你应该联系谁。
例子:
MAINTAINER Firstname Lastname <example@geeksforgeeks.com>
3. RUN
RUN 语句定义了通过 shell 运行命令、等待命令完成并保存结果。它指定了运行时容器内将运行哪个进程。
例子:
RUN unzip install.zip /opt/install
RUN echo hello
4. ADD
如果我们定义要添加一些文件,则使用 ADD 语句。它基本上指示复制新文件、目录或远程文件 URL,然后将它们添加到镜像的文件系统中。
总而言之,它可以添加本地文件、tar 压缩包的内容以及 URL。
例子:
Local Files: ADD run.sh /run.sh
Tar Archives: ADD project.tar.gz /install/
URLs: ADD https://project.example-gfg.com/downloads/1.0/testingproject.rpm/test
5. ENV
ENV 语句会在构建和运行结果时设置环境变量。它可以在 Dockerfile 及其调用的任何脚本中使用,也可以在 Dockerfile 及其调用的任何脚本中使用。这些变量会随容器一起持久化,随时可用。
例子:
ENV URL_POST=production.example-gfg.com
6. ENTRYPOINT
它指定启动容器时要使用的表达式的起始位置。ENTRYPOINT 指定要运行的命令的起始位置。如果您的容器充当命令行程序,则可以使用 ENTRYPOINT。
例子:
ENTRYPOINT ["/start.sh"]
7. CMD
CMD 指定要运行的整个命令。我们可以说 CMD 是传递给 ENTRYPOINT 的默认参数。CMD 命令的主要目的是启动容器中所需的软件。
例子:
CMD ["program-foreground"]
CMD ["executable", "program1", "program2"]
注意:如果您同时拥有 ENVIRONMENT 和 CMD,它们会合并在一起。
8. EXPOSE
EXPOSE 语句将端口映射到容器中。端口可以是 TCP 或 UDP,但默认情况下为 TCP。
例子:
EXPOSE 3030
9. VOLUME
VOLUME 语句根据您是否有一个或两个参数来定义共享卷或临时卷。
例子:
1. 如果有两个参数,它会将主机路径映射到容器路径。
VOLUME ["/host/path" "/container/path/"]
2. 如果只有一个参数,它会创建一个可以被后续容器继承的卷。
VOLUME ["/shared-data"]
10. WORKDIR
顾名思义,WORKDIR 设置容器启动的目录。其主要目的是为所有未来的 Dockerfile 命令设置工作目录。
例子:
WORKDIR /directory-name
11. USER
它设置容器将以哪个用户身份运行。如果您涉及共享网络目录,并且假定用户名或用户号固定,则此功能非常有用。
例子:
USER geeksforgeeks
USER 4000
12. ARG
构建时提供的变量由 ARG 指令定义。在 Dockerfile 中指定该指令后,您可以在创建镜像时使用 –build-arg 开关指定它。Dockerfile 支持多个 ARG 指令。Dockerfile 中唯一可以位于 FROM 指令之前的指令是 ARG。
镜像创建后,ARG 值将无法访问。正在运行的容器无法访问 ARG 变量值。
例子
ARG image_name=latest
FROM centos:$image_name
docker build -t <image-name>:<tag> --build-arg image_name=centos8
编写 Dockerfile 的最佳实践
-
请使用官方镜像作为基础镜像。尽可能使用 Alpine 镜像作为基础镜像。
-
不要复制不必要的文件和文件夹或安装/使用不必要的软件包。
-
不建议以 root 用户身份运行容器进程。请以非 root 用户身份启动应用程序容器进程。
-
尽可能减少图像层的数量。
-
尽可能尝试使用多阶段 Docker 文件来减小镜像的大小。
为 Maven 创建新的 Dockerfile
#使用官方maven镜像作为父镜像
FROM maven:3.5-jdk-8-alpine as build
#设置工作目录为/app
WORKDIR /app
#将当前目录内容复制到当前目录的容器中
COPY . .
#安装maven的mvn命令
RUN mvn install
通过使用上述 Dockerfile,我们可以构建Maven镜像,我们在FROM命令的帮助下将 Maven alpine 镜像设置为基础镜像,并在WORKDIR的帮助下设置 Maven 的工作目录,并将所需的文件和文件夹复制到 maven,我们使用COPY命令和RUN命令可以在镜像中下载所需的命令,我们正在下载 mvn 命令。