Dockerfile指令详解

1.FROM指令

  • FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。
  • 实践中,基准镜像可以是仍和可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件。
  • 如果找不到指定的镜像文件,docker build会返回一个错误信息
格式:
FROM <repository>[:<tag>] 
# 或
FROM <repository>@<digest>

# <repository>: 指定作为baseimage的名称
# <tag>: base image的标签,为可选项,省略时默认为lastest

2.MAINTANIER指令

  • 用于让Dockerfile制作者提供本人的详细信息
  • Dockerfile并不限制MAINTAINER指令可出现的位置,但推荐将其放置于FROM指令之后
格式:
MAINTANIER <authtor's detail>
# <authtor'
s detail>可以是任何文本信息,但约定俗成地使用作者名称及邮件地址

MAINTANIER "Darius<xxx@qq.com>"

3.LABEL指令

  • LABEL指令用于替代MAINTANIER
  • LABEL是key-value对,可以提供众多的信息。
格式:
LABEL <KEY>=<VALUE> <KEY>=<VALUE> <KEY>=<VALUE> ...

4.COPY指令

  • 用于从Docker主机复制文件至创建的新镜像文件
格式:
COPY <SRC>...<DEST> 
# 或
COPY ["<SRC>",..."<DEST>"]
# <SRC>: 要复制的源文件或目录,支持使用通配符
# <DEST>: 目标路劲给,即正在创建的image的文件系统的路径;建议为<dest>使用绝对路径,否则,COPY指定则以WORKDIR指令所指的路径为起始路径;
# 在路径中有空白字符时,通常使用第二种格式
文件复制准则:
  • <SRC>必须是build上下文中的路径,不能是其父目录中的文件
  • 如果<SRC>是目录,则其内部文件或子目录会被递归复制,但<SRC>目录本身不会被复制
  • 如果指定了多个<SRC>,或在<SRC>中使用了通配符,则<DEST>必须是以/结尾
  • 如果<DEST>事先不存在,他将会被自动创建,这包括其父目录路径

综合练习

建立一个docker build工作目录,在工作目录内创建一个html目录,在html目录中创建多个.html文件,要求test1.html文件不被打入镜像。

# 创建出工作目录,html目录及html文件
[root@CentOS8 ~]# mkdir build_workshop
[root@CentOS8 ~]# cd build_workshop/
[root@CentOS8 build_workshop]# mkdir html
[root@CentOS8 build_workshop]# echo "tiny web server based on busybox" >> html/index.html
[root@CentOS8 build_workshop]# echo "test1 file" >> html/test1.html
[root@CentOS8 build_workshop]# echo "test2 file" >> html/test2.html

# 编写dockerignore文件
[root@CentOS8 build_workshop]# echo "html/test1.html" >> .dockerignore

# 编写Dockerfile文件
[root@CentOS8 build_workshop]# vim Dockerfile
FROM busybox:latest
LABEL maintanier="Darius<xxx@qq.com>"
COPY html /data/www/html/

# 在工作目录内build docker镜像
[root@CentOS8 build_workshop]# docker build . -t Darius/myweb:v0.01
Sending build context to Docker daemon  5.632kB
Step 1/3 : FROM busybox:latest
 ---> 388056c9a683
Step 2/3 : LABEL maintanier="Darius<xxx@qq.com>"
 ---> Using cache
 ---> db9675c45b91
Step 3/3 : COPY html /data/www/html/
 ---> 81da6ac19386
Successfully built 81da6ac19386
Successfully tagged Darius/myweb:v0.01

# 启动镜像为容器,验证内容
[root@CentOS8 build_workshop]# docker run --name t1 -it --rm Darius/myweb:v0.01 /bin/sh
# ls /data/www/html/
index.html  test2.html                    # test1.html文件被忽略了

5.ADD指令

  • ADD指令类似于COPY指令,ADD支持使用tar文件和url路径
格式:
ADD <SRC>...<DEST>
# 或
ADD ["<SRC>",..."<DEST>"]
操作准则
  • COPY指令
  • 如果<SRC>URL<DEST>不以/结尾,则<src>指定的文件被下载并直接被创建为<dest>;如果<dest>/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>
  • 如果<SRC>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于tar -x命令;然而通过URL获取到的tar文件将不会自动展开。
  • 如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>

ADD指令示例

# 创建工作目录
[root@CentOS8 ~]# mkdir build_workshop
[root@CentOS8 ~]# cd build_workshop/

# 下载一个nginx打包压缩文件
[root@CentOS8 build_workshop]# wget http://nginx.org/download/nginx-1.20.0.tar.gz
[root@CentOS8 build_workshop]# ls
nginx-1.20.0.tar.gz

# 编写dockerfile,分别使用URL和本地文件两种方式添加文件
[root@CentOS8 build_workshop]# vim Dockerfile
FROM busybox:latest
LABEL maintanier="Darius<xxx@qq.com>"
ADD http://nginx.org/download/nginx-1.18.0.tar.gz /tmp/
ADD nginx-1.20.0.tar.gz /usr/src/

# 制作镜像
[root@CentOS8 build_workshop]# docker build . -t Darius/myweb:v0.02
Sending build context to Docker daemon  1.064MB
Step 1/4 : FROM busybox:latest
 ---> 388056c9a683
Step 2/4 : LABEL maintanier="Darius<xxx@qq.com>"
 ---> Using cache
 ---> db9675c45b91
Step 3/4 : ADD http://nginx.org/download/nginx-1.18.0.tar.gz /tmp/
Downloading [==================================================>]   1.04MB/1.04MB
 ---> b76454839061
Step 4/4 : ADD nginx-1.20.0.tar.gz /usr/src/
 ---> 5a2400adf1b0
Successfully built 5a2400adf1b0
Successfully tagged Darius/myweb:v0.02

# 启动容器验证
[root@CentOS8 build_workshop]# docker run --name t2 --rm -it Darius/myweb:v0.02 /bin/sh
# ls /usr/src
nginx-1.20.0   # 本地的tar文件放到src目录下被解压
# ls /tmp
nginx-1.18.0.tar.gz  # 使用url的tar文件没有被解压

6.WORKDIR指令

  • 用于为Dockerfile中所有的RUNCMDENTRYPOINTCOPYADD指定设定工作目录
格式:
WORKDIR <DIRPATH>
# 在Dockerfile文件中,WORKDIR指令可以出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径
# 另外WORKDIR也可以调用由ENV指定定义的变量
# 如:
WORKDIR /var/log
WORKDIR $STATEPATH

7.VOLUME指令

  • 用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷
格式
VOLUME <MOUNTPOINT>
# 或
VOLUME ["<MOUNTPOINT>"]
  • 如果挂载点目录下此前存在文件,docker run命令会在卷挂载完成后将此前目录中所存在的所有文件复制到新挂载的卷中

  • 如果docker run指令不指定-v选项来绑定宿主机上的卷路径,volume指令使用的将是docker所管理的卷

VOLUME示例

# 当前目录下文件
[root@CentOS8 build_workshop]# tree
.
├── Dockerfile
├── html
│   ├── index.html
│   ├── test1.html
│   └── test2.html
└── nginx-1.20.0.tar.gz

# 创建Dockerfile文件,指定WORKDIR,以及挂载的卷
[root@CentOS8 build_workshop]# vim Dockerfile
FROM busybox:latest
LABEL maintanier="Darius<xxx@qq.com>"
COPY html /data/www/html/
ADD http://nginx.org/download/nginx-1.18.0.tar.gz /tmp/
ADD nginx-1.20.0.tar.gz /usr/src/
WORKDIR /data/www/
VOLUME /data/www/html/

# build镜像
[root@CentOS8 build_workshop]# docker build . -t Darius/myweb:v0.03

# 启动容器验证,原先html目录下的内容依旧存在
[root@CentOS8 build_workshop]# docker run --name t1 -it Darius/myweb:v0.03 /bin/sh
/data/www # ls
html
/data/www # cd html/
/data/www/html # ls
index.html  test1.html  test2.html

# 在宿主机上查看挂载卷位置
[root@CentOS8 build_workshop]# docker inspect -f {{.Mounts}} t1
[{volume 8a8764f450c705c226918c80a9e408f56620244be86969e668ff455ca96fbbe8 /var/lib/docker/volumes/8a8764f450c705c226918c80a9e408f56620244be86969e668ff455ca96fbbe8/_data /data/www/html local  true }]

# 查看卷内数据
[root@CentOS8 build_workshop]# ls /var/lib/docker/volumes/8a8764f450c705c226918c80a9e408f56620244be86969e668ff455ca96fbbe8/_data
index.html  test1.html  test2.html

8.EXPOSE指令

  • 用于为容器打开指定要监听的端口以实现与外部通信
格式
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
# <protocol> 用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
  • EXPOSE指令可一次指定多个端口,例如
EXPOSE 11211/udp 11211/tcp

EXPOSE示例

# 当前目录下文件
[root@CentOS8 build_workshop]# tree
.
├── Dockerfile
├── html
│   ├── index.html
│   ├── test1.html
│   └── test2.html
└── nginx-1.20.0.tar.gz

# 创建Dockerfile文件,暴露出80端口
[root@CentOS8 build_workshop]# vim Dockerfile
FROM busybox:latest
LABEL maintanier="Darius<xxx@qq.com>"
COPY html /data/www/html
ADD http://nginx.org/download/nginx-1.18.0.tar.gz /tmp/
ADD nginx-1.20.0.tar.gz /usr/src/
WORKDIR /data/www/
VOLUME /data/www/html
EXPOSE 80/tcp

# 构建镜像文件
[root@CentOS8 build_workshop]# docker build . -t Darius/myweb:v0.04

# 运行容器
[root@CentOS8 build_workshop]# docker run --name t1 -it -P  Darius/myweb:v0.04 /bin/sh
# 需要注意虽然Dockerfile中带了暴露80端口,若是容器运行时不使用-P是不会将端口暴露出去的

# 查看端口映射
[root@CentOS8 build_workshop]# docker port t1
80/tcp -> 0.0.0.0:49153
80/tcp -> :::49153

9.ENV指令

  • 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其他指令(如ENVADDCOPY等)所调用
  • 调用格式为$variable_name${variable_name}

格式

ENV <KEY> <VALUE> 
# 或
ENV <KEY>=<VALUE> ...
  • 第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此一次只能设置一个变量;
  • 第二种格式可以一次设置多个变量,每个变量为一个”<key>=<value>“的键值对,如果<value>中包含空格,可以以反斜线进行转义,也可通过对<value>加引号进行标识;另外,反斜线也可用于续行;
  • 定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。

ENV示例

# 当前目录下文件
[root@CentOS8 build_workshop]# tree
.
├── Dockerfile
├── html
│   ├── index.html
│   ├── test1.html
│   └── test2.html
└── nginx-1.20.0.tar.gz

# 将/data/www/html/目录定义成变量,之后使用时进行调用
[root@CentOS8 build_workshop]# vim Dockerfile
FROM busybox:latest
LABEL maintanier="Darius<xxx@qq.com>"
ENV webhome="/data/www/html/"
COPY html $webhome
ADD http://nginx.org/download/nginx-1.18.0.tar.gz /tmp/
ADD nginx-1.20.0.tar.gz /usr/src/
WORKDIR /data/www/
VOLUME $webhome
EXPOSE 80/tcp

# 构建镜像文件
[root@CentOS8 build_workshop]# docker build . -t Darius/myweb:v0.05

# 运行容器验证ENV是否生效
[root@CentOS8 build_workshop]# docker run --name t1 -P -it Darius/myweb:v0.05 /bin/sh
/data/www # ls html/
index.html  test1.html  test2.html  # 文件已存在

10.ARG指令

  • ENV指令在容器构建时直接被定死无法改变,如果需要改变则需要对Dockerfile文件进行修改。ARG指令可以定义一个变量并且此变量可以没有值,让用户在构建镜像时使用--build-arg <varname>=<value>,来临时进行更改。
格式
ARG <NAME>[=default value]

ARG指令示例

# 当前目录下文件
[root@CentOS8 build_workshop]# tree
.
├── Dockerfile
├── html
│   ├── index.html
│   ├── test1.html
│   └── test2.html
└── nginx-1.20.0.tar.gz

# 将/data/www/html/目录定义成ARG指令变量,之后使用时进行调用
[root@CentOS8 build_workshop]# vim Dockerfile
FROM busybox:latest
LABEL maintanier="Darius<xxx@qq.com>"
ARG webhome="/data/www/html/"
COPY html $webhome
ADD http://nginx.org/download/nginx-1.18.0.tar.gz $webhome
ADD nginx-1.20.0.tar.gz /usr/src/
WORKDIR $webhome
VOLUME $webhome
EXPOSE 80/tcp

# 构建镜像文件,将webhome变量更改
[root@CentOS8 build_workshop]# docker build --build-arg webhome="/data/htdocs/" . -t Darius/myweb:v0.06

# 进入容器验证,构建时的webhome生效
[root@CentOS8 build_workshop]# docker run --name t1 -it Darius/myweb:v0.06 /bin/sh
/data/htdocs # ls
index.html           nginx-1.18.0.tar.gz  test1.html           test2.html

11.RUN指令

  • 用于指定docker build过程中运行的程序,其可以是任何命令
格式
RUN <COMMAND>
# 或
RUN ["<executable>","<param1>","<param2>"]
  • 第一种格式中,<command>通常是一个shell命令,且以/bin/sh -c来运行它,这意味着此进程在容器中的PID不为1,不能接收UNIX信号,因此,当使用docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号

  • 第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的<parmN>为传递给命令的选项或参数;然而,此种格式指定的命令不会以/bin/sh -c来发起,因此常见的shell操作如变量替换以及通配符(?*)替换将不会进行;不过,如果要运行的命令依赖于shell特性的话,可以将其替换为类似下面的格式。

    RUN ["/bin/sh","-c","<executable>","<param1>"]

RUN指令示例

# 创建工作目录
[root@CentOS8 ~]# mkdir ap
[root@CentOS8 ~]# cd ap/

# 创建dockerfile文件
[root@CentOS8 ap]# vim Dockerfile
FROM centos:7
LABEL maintanier="Darius<xxx@qq.com>"
RUN yum makecache && 
    yum install httpd php php-mysql -y && 
    yum clean all && 
    rm -rf /var/cache/yum/*

# 构建镜像
[root@CentOS8 ap]# docker build . -t Darius/apache-php:v0.01

# 运行容器,验证php和httpd已安装
[root@CentOS8 ap]# docker run --name web1 --rm -it Darius/apache-php:v0.01 /bin/bash
[root@d7428d971121 /]# rpm -q httpd php
httpd-2.4.6-97.el7.centos.x86_64
php-5.4.16-48.el7.x86_64

12.CMD指令

  • 类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
  • RUN指令运行于镜像文件构建过程,而CMD指令运行于基于Dockerfile构建出的新镜像文件启动一个容器时。
  • CMD指令的首要目的在于为启动的容器指定默认要运行的程序,而其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖
  • Dockerfile中可以存在多个CMD指令,但仅最后一个会生效
格式
CMD <command>
# 或
CMD ["<executable>","param1","param2"]
# 或
CMD ["param1","param2"]
  • 前两种语法格式的意义同RUN
  • 第三种则用于为ENTRYPOINT指令提供默认参数

CMD指令示例

# 创建工作目录
[root@CentOS8 ~]# mkdir ap
[root@CentOS8 ~]# cd ap/

# 编写Dockerfile
[root@CentOS8 ap]# vim Dockerfile
FROM centos:7
LABEL maintanier="Darius<xxx@qq.com>"
ARG hthome="/var/www/html/"
RUN yum makecache && 
    yum install httpd php php-mysql -y && 
    yum clean all && 
    rm -rf /var/cache/yum/*
VOLUME $hthome
EXPOSE 80/tcp
CMD ["/usr/sbin/httpd","-DFOREGROUND"]

# build镜像
[root@CentOS8 ap]# docker build . -t Darius/apache-php:v0.02

# 启动容器
[root@CentOS8 ap]# docker run --name myweb -d Darius/apache-php:v0.02

# 查看容器IP验证http服务启动
[root@CentOS8 ap]# docker inspect -f {{.NetworkSettings}} myweb
{{ 684c5a78c68f8033f346be128ce33b61b6cd5c4e9e4b1682f30b2f9335b86325 false  0 map[80/tcp:[]] /var/run/docker/netns/684c5a78c68f [] []} {67ca06b4be8473338927d206cea9585786d8f894b19235a7607de6c9a555b931 172.31.0.1  0 172.31.0.4 16  02:42:ac:1f:00:04} map[bridge:0xc00019a000]}

[root@CentOS8 ap]# curl -I 172.31.0.4HTTP/1.1 403 Forbidden
Date: Fri, 30 Apr 2021 02:07:27 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8

13.ENTRYPOINT指令

  • 类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
  • CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当做参数传递给ENTRYPOINT指令指定的程序
  • 不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序

格式

ENTRYPOINT <COMMAND>
ENTRYPOINT ["<executable>","<param1>","<param2>"]
  • docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后最为其参数使用
  • Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效

ENTRYPOINT示例1

# 编写php测试页面
[root@CentOS8 ap]# echo -e "<?phpntphpinfo();n?>" > index.php

# 编写dockerfile文件
[root@CentOS8 ap]# vim Dockerfile
FROM centos:7
LABEL maintanier="<438214186@qq.com>"
ARG htroot="/var/www/html/"
RUN yum makecache && 
    yum install -y httpd php php-mysql && 
    yum clean all && 
    rm -rf /var/cache/yum/*
VOLUME $htroot
ADD index.php $htroot
EXPOSE 80/tcp
ENTRYPOINT ["/usr/sbin/httpd","-DFOREGROUND"]

# 构建镜像
[root@CentOS8 ap]# docker build . -t Darius/apache-php:v0.03

# 由于使用了entrypoint,在docker run后执行的命令参数将作为entrypoint的参数,不会覆盖原先entrypoint的命令
[root@CentOS8 ap]# docker run --name web1 -it --rm Darius/apache-php:v0.03 /bin/bash
Usage: /usr/sbin/httpd [-D name] [-d directory] [-f file]
                       [-C "directive"] [-c "directive"]
                       [-k start|restart|graceful|graceful-stop|stop]
                       [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]

# 如果要让其覆盖需要使用--entrypoint参数来指定
[root@CentOS8 ap]# docker run --name web1 --rm -it --entrypoint=/bin/bash Darius/apache-php:v0.03
[root@38a5d059f368 /]#
  

ENTRYPOINT示例2


# 编写dockerfile文件
[root@CentOS8 ap]# vim Dockerfile
FROM centos:7

LABEL maintanier="<438214186@qq.com>"

ARG htroot="/var/www/html/"

RUN yum makecache && 
    yum install -y httpd php php-mysql && 
    yum clean all && 
    rm -rf /var/cache/yum/*

VOLUME $htroot

ADD index.php $htroot
ADD entrypoint.sh /bin/

EXPOSE 80/tcp

CMD ["/usr/sbin/httpd","-DFOREGROUND"]
ENTRYPOINT ["/bin/entrypoint.sh"]

# 编写entrypoint脚本
[root@CentOS8 ap]# vim entrypoint.sh
#!/bin/bash
#
listen_port=${LISTEN_PORT:-80}
server_name=${SERVER_NAME:-localhost}
doc_root=${DOC_ROOT:-/var/www/html/}

cat > /etc/httpd/conf.d/myweb.conf << EOF
Listen $listen_port

<VirtualHost *:${listen_port}>
    ServerName "$server_name"
    DocumentRoot "$doc_root"
    <Directory "$doc_root">
        Options none
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>
EOF

exec "$@"

# 编写index文件
[root@CentOS8 ap]# cat index.php
<?php
        phpinfo();
?>

14.USER指令

  • 用于指定运行image时或运行Dockerfile中任何RUNCMDENTRYPOINT指令指定的程序时的用户名或UID
  • 默认情况下,container的运行身份为root用户

格式

USER <UID>|<UserName>
# 需要注意的是,<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效ID,否则docker run命令将运行失败

15.HEALTHCHECK指令

  • HEALHCHECK指令是用来告诉容器如何去测试容器内的进程是在正常工作的。
  • HEALTHCHECK指令可以防止一个容器的进程是正常存活的但是,其本身已经不工作了,如java程序可能会发生这种情况。

格式

# HEALTHCHECK指令使用方式有2种
HEALTHCHECK [OPTIONS] CMD command (check container health by running a command inside the container)

HEALTHCHECK NONE (disable any healthcheck inherited from the base image)

# The options that can appear before CMD are:
# --interval=DURATION(default:30s)
# --timeout=DURATION(default:30s)
# --start-period=DURATION(default:0s)
# --retries=N(default:3)

# The command's exit status indicates the health status of the container.The possible values are:
# 0:success——the container is healthy and readyfor use
# 1:unhealthy——the container is not working correctly
# 2:reserved——do not use this exit code

# For example
HEALTHCHECK --interval=5m --timeout=3s 
    CMD curl -f http://localhost/ || exit 1

HEALTHCHECK示例

16.SHELL指令

  • SHELL指令用来指定运行命令时的默认shell类型
  • Linux中默认shell为["/bin/sh","-c"],windows默认为["cmd","/S","/C"]
  • SHELL指令所指定的shell类型必须以json格式指定
格式
SHELL ["EXECUTABLE","PARAMETERS"]
  • SHELL指令可以出现多次,每个SHELL指令覆盖前一个SHELL指令,并且在其之后的SHELL指令出现前生效。

17.STOPSIGNAL指令

  • STOPSIGNAL指令用来设置向容器发送什么信号停止容器的
  • 这个信号可以是一个无符号数字,它与内核的syscall中的一个位置相匹配,例如9,或者一个信号名是SIGNAME格式,例如SIGKILL
格式
STOPSIGNAL signal

18.ONBUILD指令

  • 用于在Dockerfile中定义一个触发器
  • Dockerfile用于build镜像文件,此镜像文件亦可作为base image被另一个Dockerfile用做FROM指令的参数,并以之构建新的镜像文件。
  • 在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会出发创建其base imageDockerfile文件中的ONBUILD指令的触发器

格式

ONBUILD <INSTRUCTION>
  • 尽管仍和指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FORMMAINTANIER指令
  • 使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如: ruby:2.0-onbuild
  • ONBUILD指令中使用ADDCOPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败


原文始发于微信公众号(TechOps之窗):Dockerfile指令详解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/278263.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!