Code前端首页关于Code前端联系我们

什么是 Dockerfile?如何使用它来管理图像?

terry 2年前 (2023-09-28) 阅读数 56 #未命名

什么是 Dockerfile?

Dockerfile 是用于创建镜像的文本文件。文本内容包含构建镜像所需的说明和说明。

使用Dockerfile管理镜像

这里我们只讲解如何打开Dockerfile文件来管理镜像。关于 Dockerfile 的详细说明将在下一节中介绍。这里你只需要了解一下构建过程即可。

1。接下来,配置nginx镜像(构建的镜像中会有/usr/share/nginx/html/index.html文件)

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

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

什么是 Dockerfile?如何用它定制镜像?

2。 FROM和RUN指令的作用

FROM:定制的镜像都是基于FROM镜像的,这里的nginx是定制所需的基础镜像。后续操作都是基于nginx。

RUN:用于运行以下命令行命令。有以下两种格式:

Shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

Exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意 :Dockerfile 指令每次执行时都会在 docker 中创建一个新层。因此,太多不必要的层会导致图像变得过于拥挤。例如:

FROM centos
RUN yum 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
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

同上,用&&符号连接命令。执行后,只会创建图像的第1层。

开始构建镜像

在存储 Dockerfile 的目录中执行构建操作。

下面的示例通过目录中的 Dockerfile 创建 nginx:v3(镜像名称:镜像标签)。

注意:最后一个。代表本次执行的上下文路径,下一节会介绍。

$ docker build -t nginx:v3 .

什么是 Dockerfile?如何用它定制镜像?

如上显示则说明创建成功。

上下文路径

上一节提到了最后一个。指令中是上下文路径。那么什么是上下文路径呢?

$ docker build -t nginx:v3 .

上下文路径显示 docker 创建镜像时有时想要使用本地文件(如复制)。 docker build命令学习到这个路径后,就会打包该路径下的所有内容。

分析:因为运行的docker模式是C/S。我们的本机机器是C,docker机器是S。实际的构建过程是在docker机器上完成的,所以此时无法使用本地文件。这需要将文件打包到我们本地机器的特定目录中并将它们提供给docker机器。

如果不指定最后一个参数,则默认上下文路径是Dockerfile所在的位置。

注意:不要将无用的文件放在上下文路径中,因为它们会同时打包发送到docker机器上。如果文件太多,进程会很慢。命令详细解释

COPY

copy 命令将文件或目录从上下文目录复制到容器中指定的路径。

格式:

COPY [--chown=:] <源路径1>...  <目标路径>
COPY [--chown=:] ["<源路径1>",...  "<目标路径>"]

[--chown=:]:可选参数,用户可以更改复制到容器的文件的所有者和组。

:源文件或源目录。这可以是通配符表达式,并且通配符规则必须满足 filepath.Match Go 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

:容器中指定的路径。该路径不需要提前构建。如果该路径不存在,则会自动创建。

ADD

ADD 指令与 COPY 的使用格式相同(根据相同要求,官方推荐使用 COPY)。功能是一样的,区别如下:

  • 增加优点:如果是tar压缩文件,且压缩格式为gzip、bzip2、xz,则会自动复制解压到 路径。
  • ADD 缺点:tar压缩文件不解压无法复制。这将使图像构建缓存失效,从而使图像变慢。具体是否使用可以根据是否需要自动解压来决定。

CMD

与RUN指令类似,用于运行程序,但两者运行的时间点不同:

  • CMD在docker运行时运行。
  • RUN 位于 docker 构建中。

功能:指定启动的容器默认运行的程序。当程序运行结束时,容器也会终止。 CMD指令指定的程序可以替换为docker run命令行参数指定的程序来运行。

注意:如果 Dockerfile 中有多个 CMD 指令,则仅应用最后一条。

格式:

CMD  
CMD ["<可执行文件或命令>","","",...] 
CMD ["","",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数</shell 命令>

建议使用第二种格式,因为执行过程更清晰。第一种格式在运行时会自动转换为第二种格式,默认的可执行文件为sh。

ENTRYPOINT

与CMD指令类似,但它不会被docker run命令行参数指定的指令覆盖,并且这些命令行参数将作为ENTRYPOINT指定的程序的参数。指示。

但是,如果在运行 docker run 时使用 --entrypoint 选项,则 CMD 指令指定的程序将被覆盖。

优点:运行docker run时,可以指定ENTRYPOINT操作所需的参数。

注意:如果 Dockerfile 中有多个 ENTRYPOINT 指令,则仅应用最后一个。

格式:

ENTRYPOINT ["","","",...]

可与CMD命令配合使用:CMD一般用于更改参数。这里的CMD相当于参数传递ENTRYPOINT,下面的例子会提到。

示例:

假设 nginx:test 镜像已通过 Dockerfile 创建:

FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参

1。不传参数运行

$ docker run  nginx:test

容器上默认会执行以下命令来启动主进程。

nginx -c /etc/nginx/nginx.conf

2。传递参数并运行

$ docker run  nginx:test -c /etc/nginx/new.conf

容器中默认会执行以下命令来启动主进程(/etc/nginx/new.conf:假设该文件已经在容器中)

nginx -c /etc/nginx/new.conf

ENV

设置环境变量,定义一个环境变量,那么这个环境变量就可以在后续的指令中使用。

格式:

ENV  
ENV = =...

下例设置NODE_VERSION = 7.2.0,后续指令中可通过$NODE_VERSION引用:

ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG,与E.NV参数相同。但范围不同。 ARG 设置的环境变量仅在 Dockerfile 中有效,这意味着它们仅在 docker 构建过程中有效。该环境变量不存在于构建的映像中。

docker build 构建命令可以替换为 --build-arg =。

格式:

ARG <参数名>[=<默认值>]

VOLUME

指定匿名数据的容量。如果启动容器时忘记挂载数据卷,它将自动挂载到匿名卷。

功能:

  • 防止重要数据再次因为容器而丢失,这是非常致命的。
  • 防止容器太大。

格式:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

启动docker run容器时,我们可以通过-v参数更改挂载点。

EXPOSE

只需声明端口即可。

功能:

  • 帮助镜像用户了解该镜像服务的保护端口,方便配置映射。
  • 如果运行时使用随机端口映射,即使用 docker run -P 时,会自动随机映射 EXPOSE 端口。

格式:

EXPOSE <端口1> [<端口2>...]

WORKDIR

指定工作目录。使用 WORKDIR 指定的工作目录将位于构建的每个图像层中。 (必须首先创建WORKDIR指定的工作目录)。

docker build 在镜像构建过程中,每个新层运行命令。仅保留通过 WORKDIR 创建的目录。

格式:

WORKDIR <工作目录路径>

USER

用于指定执行下一条命令的用户和用户组。这只是为了下次命令执行时切换用户(用户和用户组必须已经存在)。

格式:

USER <用户名>[:<用户组>]

HEALTHCHECK

用于指定监控docker容器服务运行状态的程序或指令。

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

ONBUILD

用于延迟执行构建命令。简单地说,在该镜像的构建过程中(假设该镜像是测试构建),Dockerfile 中使用 ONBUILD 指定的命令将不会被执行。当新的 Dockerfile 使用之前从 test-build 构建的镜像时,当执行 Dockerfile 构建新镜像时,将执行 test-build 中 Dockerfile 中 ONBUILD 指定的命令。

格式:

ONBUILD <其它指令>

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门