Dockerfile

镜像相关的操作

镜像的生成途径

  Dockerfile

  基于容器制作

 About Dockerfile

Dockerfile is nothing but the source code for building Docker images

  Docker can build images automatically by reading the instrucations from a Dockerfile

  A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image 

  Using docker build users can create an automated build that executes several command-line instrucations in succession

 Dockerfile Format

Format

  # Comment

  INSTRUCTION arguments

The instruction is not case-sensitive

  Howver,convention is for them to be UPPERCASE to distinguish them from arguments more easily

Docker runs instructions in a Dockerfile in order

The first instruction must be `FROM` in order to specify the Base Image from which you are building

Environment replacement

Environment variables(declared with the ENV statement) can also be used in certain instructions as variables to be interpreted by the Dockerfile

Environment variables are notated in the Dockerfile either with $variable_name or ${variable_name}

The ${variable_name} syntax also supports a few of the standard bash modifiers

  ${variable:-word} indicates that if variable is set then the result will be that value. IF variable is not set then word will be the result

  ${variable:+word} indicates that if variable is set then word will be the result,otherwise the result is the empty string.

.dockerignore file

Before the docker CLI sends the context to the docker daemon,it looks for a file named .dockerignore in the root directory of the context

If this file exists,the CLI modifies the context to exclude files and directories that match patterns in it

The CLI interprets the .dockerignore file as a newline-separated list of patterns similar to the file globs of Unix shells.

Dockerfile Instructions

FROm

  FROM指令是最重的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为镜像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境

  实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需的镜像文件

    如果找不到指定的镜像文件,docker build会返回一个错误信息

  Syntax

    FROM <repository>[:<tag>] 或

    FROM <repository>@<digest>

      <repository>:指顶为base image的名称

      <tag>:base image的标签,为可选项,省略时默认为latest;

Dockerfile Instructions

MAINTNIER(depreacted)
  用于让Dockerfile制作者提供本人的详细信息

  Dockerfile并不限制MAINTAINER指定可在出现的位置,但推荐奖其放置于FROM指令之后

  Syntax

    MAINTAINER<authtor's detail>
      <author's detail>可是任何文本信息,但约定俗称地使用作者名称及邮件地址

      MAINTAINER "smoke <349817712@qq.com>"

Dockerfile Instructions

The LABEL instruction adds metadata to an image

  Syntax:LABEL <key>=<value> <key>=<value> <key>=<value>...

  The LABEL instruction adds metadata to an image.

  A LABEL is a key-value pair

  To include spaces within a LABEL value,use quotes and backslashes as you would in command-line parsing.

  An image can have more than one label.

  You can specify multiple labels on single line.

Dockerfile Instructions

COPY

  用于从Docker主机复制文件至创建的新映像文件

  Syntax

    COPY<src>...<dest>或

    COPY ["<src>",..."<dest>"]

      <src>:用复制的源文件或目录,支持使用通配符

      <dest>:目标路径,即正在创建的image的文件系统路径;建议为<dest>使用绝对路径,否则,COPY指定则以WORKDIR为其起始路径。

    注意:在路径中有空白字符时,通常使用第二种格式

  文件复制准则

    <src>必须是build上下文中的路径,不能是其父目录中的文件

    如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制

    如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾

    如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径

Dockerfile Instructions

ADD

  ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径

  Syntax

    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>;

Dockerfile Instructions

WORKDIR

  用于为Dockerfile中所有的RUN、CMD、ENTRYPOIN、COPY和ADD指定设定工作目录

  Syntax

    WORKDIR <dirpath>

      在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以相对路径,不过,其是相对此前一个WORKDIR指令指定的路径

    例如

      WORKDIR /var/log

      WORKDIR $STATEPATH

Dockerfile Instructions

VOLUME

  用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷

  Syntax

    VOLUME <mountpoint> 或

    VOLUME ["<mountpoint>"]

  如果挂载点目录路径下此前文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中

Dockerfile Instructions

EXPOSE

  用于为容器打开指定要监听的端口以实现与外部通信

  Syntax

    EXPOST <port>[/<protocol>] [<port>[/<protocol>]...]

      <protocol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议

  EXPOSE指令可一次指定多个端口,例如

    EXPOSE 11211/udp 11211/tcp

Dockerfile Instructions

ENV

  用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所调用

  调用格式为$variable_name或${variable_name}

  Syntax

    ENV <key> <value> 或

    ENV <key> = <value>...

  第一种格式为,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量;

  第二种格式可用一次设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<value>中包含空格,可以以反斜线(\)进行转义,也可通过对<value>加引号进行标识;另外,反斜线也可用于续行;

  定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能

Dockerfile Instructions

RUN
  用于指定docker build过程中运行的程序,其可以是任何命令

  Syntax

    RUN <command> 或

    RUN ["<executable>","<paraml>","<param2>"]

  第一种格式中,<command>通常是一个shell命令,且以"/bin/sh -c"来运行它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使用docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号;

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

    RUN ["/bin/bash","-c","<executable>","<paraml>"]

  注意:json数组中,要使用双引号;

Dockerfile Instructions

CMD

  类似于RUN指令,CMD指令也用于运行任何命令或应用程序,不过,二者的运行时间点不同

    RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新映像文件启动一个容器时

    CMD指令的首要目的在于为启动的容器指令默认要运行的程序,且其运行结束后,容器也将终止,不过,CMD指令的命令其可以被docker run命令行选项所覆盖

    在Dockerfile中可以存在多个CMD指令,但仅最好一个会生效

  Syntax

    CMD <command> 或

    CMD ["<executable>","paraml>","<param2>"]或

    CMD ["<paraml>","<param2>"]

  前两种语法格式的意义同RUN

  第三种则用于为ENTR YPOINT指令提供默认参数

Dockerfile Instructions

ENTRYPOINT
  类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序

  与CMD不同的是,由NTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令行参数被当做参数传递给ENTRYPOINT指定的程序

    不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序

  Syntax

    ENTRYPOINT <command>

    ENTRYPOINT ["<executable>","<paraml>","<param2>"]

  docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用

  Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅最后一个会生效

 Dockerfile Instructions

USER

  用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID

  默认情况下,container的运行身份为root用户

  Syntax

    USER <UID>|<UserName>

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

Dockerfile Instructions

HEALTHCHECK

  The HEALTHCHECK instruction tells Docker how to test a container to check that it is still working

  This can detect cases such as a web server that is stuck in an infinite loop and unable to handle new connections,even though the server process is still running.

  The HEALTHCHECK instruction has two forms:

    HEALTHCHECK [OPTIONS] CMD command (check container health by running a command inside the container)

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

Dockerfile Instructions

HEALTHCHECK(2)

  The options that can appear before CMA 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 ready for 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

Dockerfile Instructions

SHELL

  The SHELL instruction allows the default shell used for the shell form of commands to be overridden

  The default shell on Linux is ["/bin/sh","-c"],and on Windows is ["cmd","/S","/C"]

  The SHELL instruction must be written in JSON form in a Dockerfile.

    Syntax:SHELL ["executable","parameters"]

  The SHELL instruction can appear multiple times.

  Each SHELL instruction overrides all previous SHELL instructions,and affects all subsequent instructions.

Dockerfile Instructions

STOHSIGNAL

  The STOPSIGNAL instruction sets the system call signal that will be sent to the container to exit.

  This signal can be a valid unsigned number that matches a position in the kernel's syscall table,for instance 9,or a signal name in the format SIGNAME,for instance SIGKILL.

  Syntax:STOPSIGNAL signal

Dockerfile Instructions

ARG

  The ARG instruction defines a variable that users can pass at build-time to the builder with the docker build command using the --build-arg <varname>=<value> flag.

  If a user specifies a build argument that was not defined in the Dockerfile,the build outputs a warning.

  Syntax:ARG <name>[=<default value>]

  A Dockerfile may include one or more ARG instructions.

  An ARG instruction can optionally include a default value:

    ARG version=1.14

    ARG user=smoke

 Dockerfile Instructions

ONBUILD

  用于在Dockerfile中定义一个触发器

  Dockerfile用于build映射文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件

  在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会"触发"创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器

  Syntax

    ONBUILD <INSTRUCTION>

  尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令

  使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuild

  在ONBUILD指令中使用ADD或COPY指令应该格外小心,因此新构建过程的上下文在缺少指定的源文件时会失败

 

node1:

[root@node1 ~]# echo ${NAME:-tom}
tom
[root@node1 ~]# NAME=jerry
[root@node1 ~]# echo ${NAME:-tom}
jerry
[root@node1 ~]# echo ${NAME:+tom}
tom
[root@node1 ~]# echo ${NAME:+tom}
[root@node1 ~]# mkdir img1
[root@node1 ~]# cd img1/
[root@node1 img1]# vim index.html
<h1>Busybox httpd server.</h1>
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
#LABEL maintainer="smoke <349817712@qq.com>"
COPY index.html /data/web/html/
[root@node1 img1]# docker build -t tinyhttpd:v0.1-1 ./
[root@node1 img1]# docker image ls
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
tinyhttpd                                             v0.1-1              28f6047527c1        2 minutes ago       1.22MB
smoke584520/httpd                                     v0.2                8128e6c4341f        7 days ago          1.22MB
registry.cn-hangzhou.aliyuncs.com/smoke584520/httpd   v0.2                8128e6c4341f        7 days ago          1.22MB
smoke584520/httpd                                     latest              80bef960860d        7 days ago          1.22MB
smoke584520/httpd                                     v0.1-1              80bef960860d        7 days ago          1.22MB
redis                                                 4-alpine            c59f425529b7        11 days ago         20.4MB
busybox                                               latest              83aa35aa1c79        3 weeks ago         1.22MB
nginx                                                 1.14-alpine         8a2fb25a19f5        12 months ago       16MB
quay.io/coreos/flannel                                v0.10.0-amd64       f0fad859c909        2 years ago         44.6MB
[root@node1 ~]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-1 cat /data/web/html/index.html
<h1>Busybox httpd server.</h1>
[root@node1 img1]# cp -r /etc/yum.repos.d/ ./
[root@node1 img1]# ls
Dockerfile  index.html  yum.repos.d
[root@node1 img1]# ls yum.repos.d/
CentOS-Base.repo  docker-ce.repo  epel.repo  OldMirrorFile
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
#LABEL maintainer="smoke <349817712@qq.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
[root@node1 img1]# docker build -t tinyhttpd:v0.1-2 ./
[root@node1 ~]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-2 ls /etc/yum.repos.d/
CentOS-Base.repo
OldMirrorFile
docker-ce.repo
epel.repo
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
#LABEL maintainer="smoke <349817712@qq.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/nginx-1.17.9.tar.gz /usr/local/src/
[root@node1 img1]# docker build -t tinyhttpd:v0.1-3 ./
[root@node1 img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-3 ls /usr/local//src/
nginx-1.17.9.tar.gz
[root@node1 img1]# vim Dockerfile
[root@node1 img1]# wget http://nginx.org/download/nginx-1.17.9.tar.gz
[root@node1 img1]# ls
Dockerfile  index.html  nginx-1.17.9.tar.gz  yum.repos.d
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.9.tar.gz /usr/local/src/
ADD nginx-1.17.9.tar.gz /usr/local/src/
[root@node1 img1]# docker build -t tinyhttpd:v0.1-4 ./
[root@node1 ~]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src/
nginx-1.17.9
[root@node1 ~]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src/nginx-1.17.9
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.9.tar.gz /usr/local/src/
WORKDIR /usr/local/    #指定工作目录

ADD nginx-1.17.9.tar.gz ./src/    #表示/usr/local/src/目录
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.9.tar.gz /usr/local/src/
WORKDIR /usr/local/

ADD nginx-1.17.9.tar.gz ./src/

VOLUME /data/mysql/
[root@node1 img1]# docker build -t tinyhttpd:v0.1-5 ./
[root@node1 ~]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-5 mount | grep /data/mysql
/dev/mapper/centos-root on /data/mysql type xfs (rw,seclabel,relatime,attr2,inode64,noquota)
[root@node1 ~]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-5 sleep 60
[root@node1 img1]# docker inspect tinyweb1
        "Mounts": [
            {
                "Type": "volume",
                "Name": "d76f5cd43e342abc32685663d345cca7fe8c12e97375b26fb46f63563ee8123a",
                "Source": "/var/lib/docker/volumes/d76f5cd43e342abc32685663d345cca7fe8c12e97375b26fb46f63563ee8123a/_data",
                "Destination": "/data/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.9.tar.gz /usr/local/src/
WORKDIR /usr/local/

ADD nginx-1.17.9.tar.gz ./src/

VOLUME /data/mysql/

EXPOSE 80/tcp
[root@node1 img1]# docker build -t tinyhttpd:v0.1-6 ./
[root@node1 ~]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-6 /bin/httpd -f -h /data//web/html
[root@node1 ~]# docker inspect tinyweb1
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "5204d69975e4ae844e5e1e3c091fc1fb70165e265262d01e72c24455876cf85d",
                    "EndpointID": "3991b85053a0cc5b49fdd26a09fcaede7c4f42f43a2e0046041bcb4f13e68ab8",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.8",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:08",
                    "DriverOpts": null
                }
            }
[root@node1 ~]# curl 172.17.0.8
<h1>Busybox httpd server.</h1>
[root@node1 ~]# docker port tinyweb1
[root@node1 ~]# docker kill tinyweb1
[root@node1 ~]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-6 /bin/httpd -f -h /data//web/html
[root@node1 ~]# docker port tinyweb1
80/tcp -> 0.0.0.0:32768

通过windows浏览器访问172.16.100.67:32768

[root@node1 ~]# docker kill tinyweb1
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
ENV DOC_ROOT /data/web/html/ \
    WEB_SERVER_PACKGE="nginx-1.17.9"

COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.9.tar.gz /usr/local/src/
WORKDIR /usr/local/

ADD ${WEB_SERVER_PACKGE}.tar.gz ./src/

VOLUME /data/mysql/

EXPOSE 80/tcp
[root@node1 img1]# docker build -t tinyhttpd:v0.1-7 ./
[root@node1 ~]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 ls /usr/local/src
nginx-1.17.9
[root@node1 ~]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 ls /usr/local/src/nginx-1.17.9
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
[root@node1 ~]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 ls /data/web/html
index.html
[root@node1 ~]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=289da23b3ab0
DOC_ROOT=/data/web/html/
WEB_SERVER_PACKAGE=nginx-1.17.9
HOME=/root
[root@node1 ~]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="nginx-1.17.8" tinyhttpd:v0.1-7 printenv    #-e指定容器创建后的环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=5dcc8d0d97f2
WEB_SERVER_PACKAGE=nginx-1.17.8
DOC_ROOT=/data/web/html/
HOME=/root
[root@node1 ~]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="nginx-1.17.8" tinyhttpd:v0.1-7 ls /usr/local/src/
nginx-1.17.9
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
ENV DOC_ROOT=/data/web/html/ \
    WEB_SERVER_PACKAGE="nginx-1.17.9.tar.gz"

COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src/
WORKDIR /usr/local/

#ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/

VOLUME /data/mysql/

EXPOSE 80/tcp

RUN cd /usr/local/src && \
    tar -x ${WEB_SERVER_PACKAGE} && \
    mv nginx-* webserver
[root@node1 img1]# docker build -t tinyhttpd:v0.1-8 ./
[root@node1 ~]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="nginx-1.17.8" -it tinyhttpd:v0.1-7
/usr/local # cd src/
/usr/local/src # ls
nginx-1.17.9
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
ENV DOC_ROOT=/data/web/html/ \
    WEB_SERVER_PACKAGE="nginx-1.17.9.tar.gz"

COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src/
WORKDIR /usr/local/

#ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/

VOLUME /data/mysql/

EXPOSE 80/tcp

#RUN cd /usr/local/src && \
#    tar -x ${WEB_SERVER_PACKAGE} && \
#    mv nginx-* webserver
[root@node1 img1]# docker build -t tinyhttpd:v0.1-8 ./
[root@node1 ~]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="nginx-1.17.8" -it tinyhttpd:v0.1-8
/usr/local # ls src
nginx-1.17.9.tar.gz
/usr/local # cd src/
/usr/local/src # tar xf nginx-1.17.9.tar.gz
/usr/local/src # rm -rf nginx-1.17.9
/usr/local/src # exit
[root@node1 img1]# vim Dockerfile
# Description: test image
FROM busybox:latest
MAINTAINER "smoke <349817712@qq.com>"
# LABEL maintainer="smoke <349817712@qq.com>"
ENV DOC_ROOT=/data/web/html/ \
    WEB_SERVER_PACKAGE="nginx-1.17.9.tar.gz"

COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src/
WORKDIR /usr/local/

#ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/

VOLUME /data/mysql/

EXPOSE 80/tcp

RUN cd /usr/local/src && \
    tar xf ${WEB_SERVER_PACKAGE}
[root@node1 img1]# docker build -t tinyhttpd:v0.1-9 ./
[root@node1 ~]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="nginx-1.17.8" -it tinyhttpd:v0.1-9 ls /usr/local/src/
nginx-1.17.9         nginx-1.17.9.tar.gz  
[root@node1 img1]# cd
[root@node1 ~]# mkdir img2
[root@node1 ~]# cd img2/
[root@node1 img2]# vim Dockerfile
FROM busybox
LABEL maintainer="smoke <349817712@qq.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html/"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
[root@node1 img2]# docker build -t tinyhttpd:v0.2-1 ./
[root@node1 ~]# docker image inspect tinyhttpd:v0.2-1
            "Cmd": [
                "/bin/sh",
                "-c",
                "/bin/httpd -f -h ${WEB_DOC_ROOT}"
            ],
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-1
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES
552ee370944d        tinyhttpd:v0.2-1           "/bin/sh -c '/bin/ht…"   21 seconds ago      Up 19 seconds                           tinyweb2
44c1f1d76aaf        busybox                    "sh"                     3 days ago          Up 3 days                               infracon
b7dd3077e6fd        smoke584520/httpd:v0.2     "/bin/httpd -f -h /d…"   9 days ago          Up 9 days                               t2
5dc203df5a1d        smoke584520/httpd:v0.1-1   "sh"                     9 days ago          Up 4 days                               t1
56fa207d1c0a        busybox                    "sh"                     9 days ago          Up 9 days                               b1
e163c9c2aa7e        redis:4-alpine             "docker-entrypoint.s…"   10 days ago         Up 10 days          6379/tcp            kvstor1
728e6866b8bb        nginx:1.14-alpine          "nginx -g 'daemon of…"   10 days ago         Up 10 days          80/tcp              web1

[root@node1 ~]# docker exec -it tinyweb2 /bin/sh
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/httpd -f -h /data/web/html/
    8 root      0:00 /bin/sh
   15 root      0:00 ps
WEB_DOC_ROOT=/data/web/html/
HOSTNAME=552ee370944d
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
/ # exit
[root@node1 img2]# vim Dockerfile
FROM busybox
LABEL maintainer="smoke <349817712@qq.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html/"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
CMD ["/bin/httpd","-f","-h ${WEB_DOC_ROOT}"]
[root@node1 img2]# docker build -t tinyhttpd:v0.2-2 ./
[root@node1 ~]# docker image inspect tinyhttpd:v0.2-2
            "Cmd": [
                "/bin/httpd",
                "-f",
                "-h ${WEB_DOC_ROOT}"
            ],
[root@node1 ~]# docker kill tinyweb2
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-2
httpd: can't change directory to ' ${WEB_DOC_ROOT}': No such file or directory
[root@node1 img2]# vim Dockerfile
FROM busybox
LABEL maintainer="smoke <349817712@qq.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html/"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
CMD ["bin/sh","-c","/bin/httpd","-f","-h ${WEB_DOC_ROOT}"]
[root@node1 img2]# docker build -t tinyhttpd:v0.2-3 ./
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-3
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS         NAMES
810a67578621        d9038812edee               "/bin/sh -c 'cd /usr…"   25 hours ago        Exited (1) 25 hours ago                 jolly_wing
6d7ee9a9a88a        busybox                    "sh"                     3 days ago          Exited (0) 2 days ago                   nginx
44c1f1d76aaf        busybox                    "sh"                     3 days ago          Up 3 days                               infracon
b7dd3077e6fd        smoke584520/httpd:v0.2     "/bin/httpd -f -h /d…"   9 days ago          Up 9 days                               t2
5dc203df5a1d        smoke584520/httpd:v0.1-1   "sh"                     9 days ago          Up 4 days                               t1
56fa207d1c0a        busybox                    "sh"                     9 days ago          Up 9 days                               b1
e163c9c2aa7e        redis:4-alpine             "docker-entrypoint.s…"   10 days ago         Up 10 days                6379/tcp      kvstor1
728e6866b8bb        nginx:1.14-alpine          "nginx -g 'daemon of…"   10 days ago         Up 10 days                80/tcp        web1
[root@node1 ~]# docker run --name tinyweb2 -it -P tinyhttpd:v0.2-3
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                      PORTS       NAMES
35f56f28d814        tinyhttpd:v0.2-3           "bin/sh -c /bin/http…"   18 seconds ago      Exited (0) 16 seconds ago               tinyweb2
810a67578621        d9038812edee               "/bin/sh -c 'cd /usr…"   25 hours ago        Exited (1) 25 hours ago                 jolly_wing
6d7ee9a9a88a        busybox                    "sh"                     3 days ago          Exited (0) 2 days ago                   nginx
44c1f1d76aaf        busybox                    "sh"                     3 days ago          Up 3 days                               infracon
b7dd3077e6fd        smoke584520/httpd:v0.2     "/bin/httpd -f -h /d…"   9 days ago          Up 9 days                               t2
5dc203df5a1d        smoke584520/httpd:v0.1-1   "sh"                     9 days ago          Up 4 days                               t1
56fa207d1c0a        busybox                    "sh"                     9 days ago          Up 9 days                               b1
e163c9c2aa7e        redis:4-alpine             "docker-entrypoint.s…"   10 days ago         Up 10 days                  6379/tcp    kvstor1
728e6866b8bb        nginx:1.14-alpine          "nginx -g 'daemon of…"   10 days ago         Up 10 days                  80/tcp      web1
[root@node1 img2]# vim Dockerfile
FROM busybox
LABEL maintainer="smoke <349817712@qq.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html/"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
CMD ["bin/sh","-c","/bin/httpd","-f","-h /data/web/html"]
[root@node1 img2]# docker build -t tinyhttpd:v0.2-4 ./
[root@node1 ~]# docker rm tinyweb2
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-4
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS       NAMES
810a67578621        d9038812edee               "/bin/sh -c 'cd /usr…"   25 hours ago        Exited (1) 25 hours ago               jolly_wing
6d7ee9a9a88a        busybox                    "sh"                     3 days ago          Exited (0) 2 days ago                 nginx
44c1f1d76aaf        busybox                    "sh"                     3 days ago          Up 3 days                             infracon
b7dd3077e6fd        smoke584520/httpd:v0.2     "/bin/httpd -f -h /d…"   9 days ago          Up 9 days                             t2
5dc203df5a1d        smoke584520/httpd:v0.1-1   "sh"                     9 days ago          Up 4 days                             t1
56fa207d1c0a        busybox                    "sh"                     9 days ago          Up 9 days                             b1
e163c9c2aa7e        redis:4-alpine             "docker-entrypoint.s…"   10 days ago         Up 10 days                6379/tcp    kvstor1
728e6866b8bb        nginx:1.14-alpine          "nginx -g 'daemon of…"   10 days ago         Up 10 days                80/tcp      web1
[root@node1 img2]# vim Dockerfile
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-4 ls /data/web/html
index.html
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-4 /bin/httpd -f -h /data/web/html
[root@node1 ~]# docker kill tinyweb2
[root@node1 img2]# vim Dockerfile
FROM busybox
LABEL maintainer="smoke <349817712@qq.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html/"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
#CMD ["bin/sh","-c","/bin/httpd","-f","-h /data/web/html"]
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
[root@node1 img2]# docker build -t tinyhttpd:v0.2-5 ./
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-5
[root@node1 ~]# docker kill tinyweb2
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-5 ls /data/web/html/    #无法运行ls命令
[root@node1 ~]# docker kill tinyweb2
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P --entrypoint "ls /data" tinyhttpd:v0.2-5    #覆盖前面的命令
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"ls /data\":
 stat ls /data: no such file or directory": unknown.
[root@node1 img2]# vim Dockerfile
FROM busybox
LABEL maintainer="smoke <349817712@qq.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html/"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
#CMD ["bin/sh","-c","/bin/httpd","-f","-h /data/web/html"]
CMD ["/bin/httpd","-f","-h ${WEB_DOC_ROOT}"]    #把CMD命令当做参数送给ENTRYPOINT执行
ENTRYPOINT /bin/sh -c
[root@node1 img2]# docker build -t tinyhttpd:v0.2-6 ./
[root@node1 ~]# docker image inspect tinyhttpd:v0.2-6
            "Cmd": [
                "/bin/httpd",
                "-f",
                "-h ${WEB_DOC_ROOT}"
            ],
            "Entrypoint": [
                "/bin/sh",
                "-c",
                "/bin/sh -c"
            ],
[root@node1 img2]# vim Dockerfile
FROM busybox
LABEL maintainer="smoke <349817712@qq.com>" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html/"

RUN mkdir -p $WEB_DOC_ROOT && \
    echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html

#CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
#CMD ["bin/sh","-c","/bin/httpd","-f","-h /data/web/html"]
CMD ["/bin/httpd","-f","-h ${WEB_DOC_ROOT}"]
ENTRYPOINT ["/bin/sh","-c"]
[root@node1 img2]# docker build -t tinyhttpd:v0.2-7 ./
[root@node1 ~]# docker image inspect tinyhttpd:v0.2-7
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "ENTRYPOINT [\"/bin/sh\" \"-c\"]"
            ],
            "Entrypoint": [
                "/bin/sh",
                "-c"
            ],
[root@node1 ~]# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.2-7
[root@node1 ~]# docker run --name tinyweb2 -it -P tinyhttpd:v0.2-7
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                      PORTS     NAMES
77f4050da686        tinyhttpd:v0.2-7           "/bin/sh -c /bin/htt…"   23 seconds ago      Exited (0) 22 seconds ago             tinyweb2
810a67578621        d9038812edee               "/bin/sh -c 'cd /usr…"   26 hours ago        Exited (1) 26 hours ago               jolly_wing
6d7ee9a9a88a        busybox                    "sh"                     3 days ago          Exited (0) 2 days ago                 nginx
44c1f1d76aaf        busybox                    "sh"                     3 days ago          Up 3 days                             infracon
b7dd3077e6fd        smoke584520/httpd:v0.2     "/bin/httpd -f -h /d…"   9 days ago          Up 9 days                             t2
5dc203df5a1d        smoke584520/httpd:v0.1-1   "sh"                     9 days ago          Up 4 days                             t1
56fa207d1c0a        busybox                    "sh"                     9 days ago          Up 9 days                             b1
e163c9c2aa7e        redis:4-alpine             "docker-entrypoint.s…"   10 days ago         Up 10 days                  6379/tcp  kvstor1
728e6866b8bb        nginx:1.14-alpine          "nginx -g 'daemon of…"   10 days ago         Up 10 days                  80/tcp    web1
[root@node1 ~]# docker rm tinyweb2
[root@node1 ~]# docker run --name tinyweb2 -it -P tinyhttpd:v0.2-7 ls /data
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
[root@node1 ~]# docker rm tinyweb2
tinyweb2
[root@node1 ~]# docker run --name tinyweb2 -it -P tinyhttpd:v0.2-7 "ls /data"
web
[root@node1 img2]# cd
[root@node1 ~]# mkdir img3
[root@node1 ~]# cd img3
[root@node1 img3]# vim entrypoint.sh
#!bin/sh
#
cat > /etc/nginx/conf.d/www.conf << EOF
{
        server_name $HOSTNAME;
        listen ${IP:-0.0.0.0}:${PORT:-80};
        root ${NGX_DOC_ROOT:-/usr/share/nginx/html};

}
EOF

exec "$@"
[root@node1 img3]# chmod +x entrypoint.sh
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="smoke <349817712@qq.com>"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD entrypoint.sh /bin/

CMD ['/usr/sbin/nginx','-g','daemon off;']
ENTRYPOINT ['/bin/entrypoint.sh']
[root@node1 img3]# docker build -t myweb:v0.3-1 ./
[root@node1 ~]# docker run --name myweb1 --rm -P myweb:v0.3-1
/bin/sh: line 1: [/bin/entrypoint.sh]: not found
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="smoke <349817712@qq.com>"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD entrypoint.sh /bin/

CMD ['/usr/sbin/nginx','-g','daemon off;']
ENTRYPOINT ['/bin/sh','-c','/bin/entrypoint.sh']
[root@node1 img3]# docker build -t myweb:v0.3-2 ./
[root@node1 ~]# docker run --name myweb1 --rm -P myweb:v0.3-2
/bin/sh: line 1: [/bin/sh,-c,/bin/entrypoint.sh]: not found
[root@node1 img3]# vim entrypoint.sh
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="smoke <349817712@qq.com>"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD entrypoint.sh /bin/

CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@node1 img3]# docker build -t myweb:v0.3-3 ./
[root@node1 ~]# docker run --name myweb1 --rm -P myweb:v0.3-3
2020/04/09 10:37:45 [emerg] 1#1: unexpected "{" in /etc/nginx/conf.d/www.conf:1
nginx: [emerg] unexpected "{" in /etc/nginx/conf.d/www.conf:1
[root@node1 ~]# docker run --name myweb1 --rm -P -it myweb:v0.3-3 /bin/sh
/ # cat /etc/nginx/conf.d/www.conf
{
        server_name 654b1e5ae8c2;
        listen 0.0.0.0:80;
        root /data/web/html/;

}
/ # exit
[root@node1 img3]# vim entrypoint.sh
#!bin/sh
#
cat > /etc/nginx/conf.d/www.conf << EOF
server {
        server_name $HOSTNAME;
        listen ${IP:-0.0.0.0}:${PORT:-80};
        root ${NGX_DOC_ROOT:-/usr/share/nginx/html};

}
EOF

exec "$@"
[root@node1 img3]# docker build -t myweb:v0.3-4 ./
[root@node1 ~]# docker run --name myweb1 --rm -P myweb:v0.3-4
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="smoke <349817712@qq.com>"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/

CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@node1 img3]# vim index.html
<h1>New Doc Root for Nginx</h1>
[root@node1 img3]# docker build -t myweb:v0.3-5 ./
[root@node1 ~]# docker kill myweb1
[root@node1 ~]# docker run --name myweb1 --rm -P myweb:v0.3-5
/ # ls /etc/nginx/conf.d/www.conf
/etc/nginx/conf.d/www.conf
/ # cat /etc/nginx/conf.d/www.conf
server {
        server_name 49163b52cf10;
        listen 0.0.0.0:80;
        root /data/web/html/;

}
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
/ # wget -O - -q localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ # wget -O - -q 49163b52cf10
<h1>New Doc Root for Nginx</h1>
/ # exit
[root@node1 ~]# docker kill myweb1
[root@node1 ~]# docker run --name myweb1 --rm -P -e "PORT=8080" myweb:v0.3-5
[root@node1 ~]# docker exec -it myweb1 /bin/sh
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 nginx: master process /usr/sbin/nginx -g daemon off;
   11 nginx     0:00 nginx: worker process
   12 root      0:00 /bin/sh
   20 root      0:00 ps
/ # exit
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="smoke <349817712@qq.com>"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/

EXPOSE 80/tcp

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/

CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@node1 img3]# docker build -t myweb:v0.3-6 ./
[root@node1 ~]# docker kill myweb1
[root@node1 ~]# docker run --name myweb1 --rm -P -e "PORT=8080" myweb:v0.3-6
[root@node1 ~]# docker exec -it myweb1 /bin/sh
[root@node1 ~]# docker exec -it myweb1 /bin/sh
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
/ # exit
[root@node1 ~]# docker kill myweb1
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="smoke <349817712@qq.com>"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/

EXPOSE 80/tcp

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:10080/

CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@node1 img3]# docker build -t myweb:v0.3-7 ./
[root@node1 ~]# docker run --name myweb1 --rm -P -e "PORT=8080" myweb:v0.3-7
[root@node1 ~]# docker exec -it myweb1 /bin/sh
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
/ # exit
[root@node1 ~]# docker kill myweb1
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine

ARG author="smoke <349817712@qq.com>"
LABEL maintainer="${author}"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/

EXPOSE 80/tcp

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:10080/

CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@node1 img3]# docker build -t myweb:v0.3-8 ./
[root@node1 ~]# docker image inspect myweb:v0.3-8
            "Labels": {
                "maintainer": "smoke <349817712@qq.com>"
            },
[root@node1 img3]# docker build --build-arg author="pony <pony@qq.com>" -t myweb:v0.3-9 ./
[root@node1 ~]# docker image inspect myweb:v0.3-9
            "Labels": {
                "maintainer": "pony <pony@qq.com>"
            },
[root@node1 img3]# vim Dockerfile
FROM nginx:1.14-alpine

ARG author="smoke <349817712@qq.com>"
LABEL maintainer="${author}"

ENV NGX_DOC_ROOT='/data/web/html/'

ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/

EXPOSE 80/tcp

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:10080/

ONBUILD ADD https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/PackageKit-gstreamer-plugin-1.1.10-1.el7.centos.x86_64.rpm /usr/local/src/

CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@node1 img3]# docker build --build-arg author="pony <pony@qq.com>" -t myweb:v0.3-10 ./
[root@node1 ~]# mkdir img4
[root@node1 ~]# cd img4
[root@node1 img4]# vim Dockerfile
FROM myweb:v0.3-10

RUN mkdir /tmp/test
[root@node1 img4]# docker build -t test:v0.1-1 ./    #使用钢材的基础镜像才执行触发器中下载文件
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM myweb:v0.3-10
# Executing 1 build trigger
Downloading [==================================================>]  11.92kB/11.92kB

 ---> 45d33943a440
Step 2/2 : RUN mkdir /tmp/test
 ---> Running in 1b63b3bc73dc
Removing intermediate container 1b63b3bc73dc
 ---> 1cfaea7c1462
Successfully built 1cfaea7c1462
Successfully tagged test:v0.1-1
[root@node1 ~]# docker run --name test1 --rm test:v0.1-1 ls /usr/local/src
PackageKit-gstreamer-plugin-1.1.10-1.el7.centos.x86_64.rpm