什么是 Dockerfile?

Dockerfile 是 Docker 用于构建镜像的文本配置文件,定义了镜像的构建步骤和环境配置,包含了构建 Docker 镜像的所有指令。

使用 Dockerfile 定制镜像

下面定制一个 nginx 镜像为例,构建好的镜像内会有一个/usr/share/nginx/html/index.html 的文件。

创建 Dockerfile

在一个空目录下,新建一个名为 Dockerfile 的文件,并在文件内添加 以下 内容。

[root@lavm-5wutyiasaf gps]# vim Dockerfile
[root@lavm-5wutyiasaf gps]# cat Dockerfile 
From nginx
RUN echo "这是一个本地构建的nginx镜像" > /usr/share/nginx/html/index.html

基本命令说明:

  • FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制所需要的基础原始镜像。
  • RUN:用于执行后面跟着的命令行命令。

注:

Dockerfile 的指令每执行一次都会在 Docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

例如,下面的写法会创建 3 层镜像:

[root@lavm-5wutyiasaf gps]# cat Dockerfle
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

构建镜像

在 Dockerfile 文件存放目录下,执行构建动作:

[root@lavm-5wutyiasaf gps]# ls
1.txt  Dockerfile
[root@lavm-5wutyiasaf gps]# docker build -f Dockerfile -t  nginx:1 .

参数说明:

  • -f:指定文件名。Dockerfile 必须以大写 D 开头命名为 Dockerfile,除非使用-f 参数指定其他文件名。
  • -t:参数用于 指定镜像名称和标签。
  • .:最后的点表示构建上下文路径。

注意:

上下文路径不要放无用的文件,因为 会一起打包发送给 Docker 引擎,如果文件过多会造成 构建过程缓慢。

Dockerfile 指令详解

指令说明示例关键细节
FROM指定基础镜像,用于后续的指令构FROM ubuntu:22.04必须为第一条指令(ARG 除外)
MAINTAINER指定 Dockerfile 的作者/维护者(已弃用,推荐使用 LABEL)MAINTAINER gps作用与 LABEL 指令类似,用于镜像添加作者、维护者、联系方式等元数据;仅限于指定维护者信息。
LABEL添加镜像的元数据,使用键值对的形式LABEL version="1.0"比 MAINTAINER 更有广泛的用途,可以用来 添加更多类型的元数据信息,
RUN在构建过程中在镜像中执行命令RUN apt-get update && apt-get install -y nginx合并命令可减少层数
CMD指定容器创建时的默认命令(可以被覆盖)Shell 格式:
CMD python app.py
Exec 格式:
CMD ["python","app.py"]
一个 Dockerfile 里 只能包含一个 CMD 指令,如果有多个,只有最后一个 CMD 指令会 生效。
ENTRYPOINT设置容器创建时的主要命令(不可被覆盖)ENTRYPOINT ["echo","hello"]该指令会在容器启动时始终执行,无论是否指定了其他命令,都不会被覆盖,而是作为容器的主要执行命令 。
EXPOSE声明容器运行时监听的特定网络端口EXPOSE 80
ENV在容器内部设置环境变量ENV MY_NAME gps
ENV APP_HOME /app
容器启动时环境变量是 ENV 指定的值,运行时可通过 docker run 明的-e 选项还覆盖环境变量的值。
ADD将文件、目录或远程URL复制到镜像中ADD app.py /app/
ADD src/ /app/
ADD https://example.com/file.tar.gz /tmp/
ADD app.tar.gz /app/
它类似于COPY指令,但在功能上更强大,除了复制文件和目录 ,该指令还 支持 自动解压缩。
COPY将文件或目录复制到镜像中COPY app.py /app/
COPY src/ /app/
它不支持自动解压缩功能,与ADD指令相比,功能更简单明确。
VOLUME为容器创建挂载点或声明卷单个目录:
VOLUME ["/data"]
多个目录:
VOLUME ["/data","/var/log"]
WORKDIR设置后续指令的工作目录WORKDIR /app
USER指定后续指令的用户上下文USER myuser容器运行时,进程将以 myuser 用户的身份运行,而不是以 root 用户身份。
ARG定义构建过程中的变量ARG MY_ENV=production
ENV ENVIRONMENT=$MY_ENV
ONBUILD当镜像被用作另一个构建过程的基础时,添加触发器