dockerfile的编写

ARG :指定创建镜像过程中使用的变量

格式 ARG  <name> = [<default value>];在执行docker build 的时候,可以通过-build-arg=来为变量赋值。当镜像编译成功后,ARG指定的变量将再存在(ENV 指定的变量会留在镜像里保留)。docker 内置了一些镜像创建变量,用户可以直接使用无需声明,包括(区分大小写)HPPT_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY

FROM: 指定创建镜像时使用的基础镜像

格式 FROM <image>  [AS <name>] 或者 FROM  <image>:<tag> [AS <name>] 或者FROM  <image>@<digest> [AS <name>];任何Dockerfile中第一条指令必须为FROM指令。并且,如果同一个dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次);为保证镜像精简,可以选用体积较小的镜像如Alpine或Debian作为基础镜像

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
[root@master ~]# docker build -t cx /root
Sending build context to Docker daemon  386.9MB
Step 1/2 : ARG   VERSION=9.3
Step 2/2 : FROM debian:${VERSION}
9.3: Pulling from library/debian
3e731ddb7fc9: Pull complete 
Digest: sha256:4fcd8c0b6f5e3bd44a3e63be259fd0c038476d432953d449ef34aedf16def331
Status: Downloaded newer image for debian:9.3
 ---> 1b3ec9d977fb
Successfully built 1b3ec9d977fb
Successfully tagged cx:latest
[root@master ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        11 days ago         1.22MB
cx                  latest              1b3ec9d977fb        2 years ago         100MB
debian              9.3                 1b3ec9d977fb        2 years ago         100MB

LABEL:指令生成镜像添加元数据的标签信息。这些标签信息可以用来辅助过滤特定镜像

格式 LABEL   <key> = <value> ....

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
[root@master ~]# docker build -t cx:0.v1 /root
Sending build context to Docker daemon  386.9MB
Step 1/4 : ARG   VERSION=9.3
Step 2/4 : FROM debian:${VERSION}
 ---> 1b3ec9d977fb
Step 3/4 : LABEL   version="1.0.0-rc3"
 ---> Running in 1a7cd7bc3b50
Removing intermediate container 1a7cd7bc3b50
 ---> fa75eedc0b84
Step 4/4 : LABEL   author="cx@github" date="2020-03-19"
 ---> Running in c7cbfb899f2d
Removing intermediate container c7cbfb899f2d
 ---> c837f32b47bd
Successfully built c837f32b47bd
Successfully tagged cx:0.v1

   EXPOSE 声明镜像内服务监听的端口。格式为EXPOSE <port> [<port>/<portocol>]

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
[root@master ~]# docker build -t cx:0.v2 /root

  注意该指令只是起到声明作用,并不会自动完成端口映射,如果想要映射端口,在启动容器时可以使用-P参数 或者 -p HOST_PORT(主机端口):CONAINER_PORT(容器端口)

 ENV:指定环境变量,镜像生成过程中会被后续的RUN指令使用,在镜像启动后也会存在;

格式:ENV   <key>   <value>   或者 ENV key = value

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
ENV   APP_VERSION=1.0.0
[root@master ~]# docker build -t cx:0.v3 /root

  注意指令指定环境变量在运行时可以被覆盖掉,如docker run --env <key>=<value> image;当一条ENV指令中同时为多个环境变量赋值并且值也是从环境变量里取,会为环境变量赋值后再更新,最终结果key1=value1 key2= value2

ENV key1=value2
ENV key1= value1 key2=${key1}

  ENTRYPOINT:指定镜像默认入口命令,该入口命令会在启动容器时作为根命令去执行,所有传入值作为该命令参数;类似于CMD的功能,用于为容器指定默认启动程序。从而是容器像一个单独的可执行程序,与CMD不同的是; 由ENTRYPOINT启动的程序不会被docker   run 命令行指定的参数覆盖,而CMD指定的命令则被当做参数传递给ENTRYPOINT指定的程序;不过 docker run 命令的 --entrypoint 选项参数可以覆盖ENTRYPOINT指令指定的程序

格式  ENTRYPOINT  <command>  或者 ENTRYPOINT ["<excutable>","<param1>","<param2>"]

Docker run 传入的命令参数会覆盖CMD指令指定的内容;Dockerfile可以存着多个ENTRYPOINT指令,仅最后一个生效

[root@master image]# cat Dockerfile 
#ARG   VERSION=9.3
FROM busybox
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
ENV WEB_DOC_ROOT="data/web/html"
RUN mkdir -p $WEB_DOC_ROOT && \
    echo 'hijkjk' > ${WEB_DOC_ROOT}/index.html
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}

[root@master image]# docker build -t cx:0.t2 ./
Sending build context to Docker daemon  1.042MB
Step 1/6 : FROM busybox
 ---> 83aa35aa1c79
Step 2/6 : LABEL   version="1.0.0-rc3"
 ---> Using cache
 ---> e17e8c86f021
Step 3/6 : LABEL   author="cx@github" date="2020-03-19"
 ---> Using cache
 ---> be9c2eec007b
Step 4/6 : ENV WEB_DOC_ROOT="data/web/html"
 ---> Using cache
 ---> e725ad9bdef2
Step 5/6 : RUN mkdir -p $WEB_DOC_ROOT &&     echo 'hijkjk' > ${WEB_DOC_ROOT}/index.html
 ---> Using cache
 ---> 0efeb4d09426
Step 6/6 : ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
 ---> Running in 72e6ca9cab6b
Removing intermediate container 72e6ca9cab6b
 ---> f75510b7e2fc
Successfully built f75510b7e2fc
Successfully tagged cx:0.t2
[root@master image]# docker run  --name web-2 --rm cx:0.t2 /bin/ls /etc

  

 

COPY 复制操作

格式 COPY <源>  目标  或者 COPY “源”“目标” 

源:复制的源文件及目录,支持通配符 

目标: 目标路径,既正常创建的image的文件系统路径,建议使用绝对路径

复制准则:源文件必须为build上下文中路径,不能是父目录;如果源文件是目录,则其内部文件或子目录会被递归复制,但源文件目录自身不会被复制;如果指定多个源文件,或者使用通配符,则目标必须是一个目标且必须以/结尾;如果目标不存在,它会被自动创建,这包括其父目录

[root@master ~]# echo "wergthjkl;" > index.html
[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
ENV   APP_VERSION=1.0.0
COPY index.html /data/web/html/
[root@master ~]# docker build -t cx:0.v5 /root
Sending build context to Docker daemon  386.9MB
Step 1/7 : ARG   VERSION=9.3
Step 2/7 : FROM debian:${VERSION}
 ---> 1b3ec9d977fb
Step 3/7 : LABEL   version="1.0.0-rc3"
 ---> Using cache
 ---> fa75eedc0b84
Step 4/7 : LABEL   author="cx@github" date="2020-03-19"
 ---> Using cache
 ---> c837f32b47bd
Step 5/7 : EXPOSE   22  808
 ---> Using cache
 ---> a989df6b5cf3
Step 6/7 : ENV   APP_VERSION=1.0.0
 ---> Using cache
 ---> 7315ee41a9c9
Step 7/7 : COPY index.html /data/web/html/
 ---> 12163b0f561a
Successfully built 12163b0f561a
Successfully tagged cx:0.v5
[root@master ~]# docker run -it cx:0.v5 /bin/sh
# ls /data/web/html
index.html
# cat /data/web/html/index.html
wergthjkl;
# exit

   ADD 指令类似于COPY指令,ADD支持压缩文件解压和URL路径

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
ENV   APP_VERSION=1.0.0
COPY index.html /data/web/html/
ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /data/nginx/
[root@master ~]# docker build -t cx:0.v6 /root
Sending build context to Docker daemon  386.9MB
Step 1/8 : ARG   VERSION=9.3
Step 2/8 : FROM debian:${VERSION}
 ---> 1b3ec9d977fb
Step 3/8 : LABEL   version="1.0.0-rc3"
 ---> Using cache
 ---> fa75eedc0b84
Step 4/8 : LABEL   author="cx@github" date="2020-03-19"
 ---> Using cache
 ---> c837f32b47bd
Step 5/8 : EXPOSE   22  808
 ---> Using cache
 ---> a989df6b5cf3
Step 6/8 : ENV   APP_VERSION=1.0.0
 ---> Using cache
 ---> 7315ee41a9c9
Step 7/8 : COPY index.html /data/web/html/
 ---> Using cache
 ---> 12163b0f561a
Step 8/8 : ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /data/nginx/
Downloading [==================================================>]  1.039MB/1.039MB
 ---> 10cb74dc466b
Successfully built 10cb74dc466b
Successfully tagged cx:0.v6
[root@master ~]# docker run -it cx:0.v6  /bin/sh
# ls /data/nginx
nginx-1.17.9.tar.gz

  本地压缩文件测试

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
ENV   APP_VERSION=1.0.0
COPY index.html /data/web/html/
ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /data/nginx/
ADD flink-1.10.0-src.tgz   /data/flink
[root@master ~]# ls
anaconda-ks.cfg  Dockerfile  flink-1.10.0-src.tgz  hadoop  hadoop-2.6.1.tar.gz  index.html  jdk-8u161-linux-x64.tar.gz
[root@master ~]# docker build -t cx:0.v7 /root
Sending build context to Docker daemon  408.8MB
Step 1/9 : ARG   VERSION=9.3
Step 2/9 : FROM debian:${VERSION}
 ---> 1b3ec9d977fb
Step 3/9 : LABEL   version="1.0.0-rc3"
 ---> Using cache
 ---> fa75eedc0b84
Step 4/9 : LABEL   author="cx@github" date="2020-03-19"
 ---> Using cache
 ---> c837f32b47bd
Step 5/9 : EXPOSE   22  808
 ---> Using cache
 ---> a989df6b5cf3
Step 6/9 : ENV   APP_VERSION=1.0.0
 ---> Using cache
 ---> 7315ee41a9c9
Step 7/9 : COPY index.html /data/web/html/
 ---> Using cache
 ---> 12163b0f561a
Step 8/9 : ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /data/nginx/
Downloading [==================================================>]  1.039MB/1.039MB
 ---> Using cache
 ---> 10cb74dc466b
Step 9/9 : ADD flink-1.10.0-src.tgz   /data/flink
 ---> 534050f68c8a
Successfully built 534050f68c8a
Successfully tagged cx:0.v7
[root@master ~]# docker run -it cx:0.v7  /bin/sh
# ls /data/flink
flink-1.10.0
# ls /data/flink/flink-1.10.0
LICENSE		     flink-clients     flink-docs	       flink-java	 flink-ml-parent	flink-runtime-web     flink-streaming-scala    flink-yarn-tests
NOTICE		     flink-connectors  flink-end-to-end-tests  flink-jepsen	 flink-optimizer	flink-scala	      flink-table	       licenses
README.md	     flink-container   flink-examples	       flink-kubernetes  flink-python		flink-scala-shell     flink-test-utils-parent  pom.xml
azure-pipelines.yml  flink-contrib     flink-filesystems       flink-libraries	 flink-queryable-state	flink-shaded-curator  flink-tests	       tools
docs		     flink-core        flink-formats	       flink-mesos	 flink-quickstart	flink-state-backends  flink-walkthroughs
flink-annotations    flink-dist        flink-fs-tests	       flink-metrics	 flink-runtime		flink-streaming-java  flink-yarn

  WORKDIR 设定工作目录

ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
ENV   APP_VERSION=1.0.0
COPY index.html /data/web/html/
#ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /data/nginx/
ADD flink-1.10.0-src.tgz   /data/flink
WORKDIR /data
[root@master ~]# docker build -t cx:0.v8 /root
Sending build context to Docker daemon  408.8MB
Step 1/9 : ARG   VERSION=9.3
Step 2/9 : FROM debian:${VERSION}
 ---> 1b3ec9d977fb
Step 3/9 : LABEL   version="1.0.0-rc3"
 ---> Using cache
 ---> fa75eedc0b84
Step 4/9 : LABEL   author="cx@github" date="2020-03-19"
 ---> Using cache
 ---> c837f32b47bd
Step 5/9 : EXPOSE   22  808
 ---> Using cache
 ---> a989df6b5cf3
Step 6/9 : ENV   APP_VERSION=1.0.0
 ---> Using cache
 ---> 7315ee41a9c9
Step 7/9 : COPY index.html /data/web/html/
 ---> Using cache
 ---> 12163b0f561a
Step 8/9 : ADD flink-1.10.0-src.tgz   /data/flink
 ---> 19096a36262f
Step 9/9 : WORKDIR /data
 ---> Running in e4a4a04ce841
Removing intermediate container e4a4a04ce841
 ---> 99eb5a8d863f
Successfully built 99eb5a8d863f
Successfully tagged cx:0.v8
[root@master ~]# docker run -it cx:0.v8  /bin/sh
# pwd
/data
           

  VOLUME:创建一个数据卷挂载点;格式为VOLUME ["/data"];用于在image中创建一个挂载点目录,以挂载Docker host 上的卷或其他容器上的卷如果挂在点目录路径下此前在文件存在,docker run命令会在挂在卷挂在完成后将此前的索引文件复制到新挂在的卷中

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
ENV   APP_VERSION=1.0.0
COPY index.html /data/web/html/
#ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /data/nginx/
ADD flink-1.10.0-src.tgz   /data/flink
WORKDIR /data
VOLUME  /data/mysql
[root@master ~]# docker build -t cx:0.v9 /root
Sending build context to Docker daemon  408.8MB
Step 1/10 : ARG   VERSION=9.3
Step 2/10 : FROM debian:${VERSION}
 ---> 1b3ec9d977fb
Step 3/10 : LABEL   version="1.0.0-rc3"
 ---> Using cache
 ---> fa75eedc0b84
Step 4/10 : LABEL   author="cx@github" date="2020-03-19"
 ---> Using cache
 ---> c837f32b47bd
Step 5/10 : EXPOSE   22  808
 ---> Using cache
 ---> a989df6b5cf3
Step 6/10 : ENV   APP_VERSION=1.0.0
 ---> Using cache
 ---> 7315ee41a9c9
Step 7/10 : COPY index.html /data/web/html/
 ---> Using cache
 ---> 12163b0f561a
Step 8/10 : ADD flink-1.10.0-src.tgz   /data/flink
 ---> Using cache
 ---> 19096a36262f
Step 9/10 : WORKDIR /data
 ---> Using cache
 ---> 99eb5a8d863f
Step 10/10 : VOLUME  /data/mysql
 ---> Running in 5b388ececba3
Removing intermediate container 5b388ececba3
 ---> 36d0c793b212
Successfully built 36d0c793b212
Successfully tagged cx:0.v9
[root@master ~]# docker run --name ww --rm cx:0.v9 mount
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/FZMDHLVJYWHK3QKJ6N5QVLMURE:/var/lib/docker/overlay2/l/OUFAS52HHG5ZSEUZXQFJH6J5J3:/var/lib/docker/overlay2/l/REN4VJX2
R2AXBG4ZYUF6YWSK7T:/var/lib/docker/overlay2/l/PLWU4G3GY76YVRTV7HVOCP3S25,upperdir=/var/lib/docker/overlay2/1172520db62eddc83d464b9d2f41e9341e023d01347b7105f9af61d848a23a89/diff,workdir=/var/lib/docker/overlay2/1172520db62eddc83d464b9d2f41e9341e023d01347b7105f9af61d848a23a89/work)proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (ro,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)  
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
/dev/mapper/centos_hadoop--1-root on /data/mysql type xfs (rw,relatime,attr2,inode64,noquota)   挂在了
/dev/mapper/centos_hadoop--1-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos_hadoop--1-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos_hadoop--1-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,noquota)
proc on /proc/bus type proc (ro,relatime)
proc on /proc/fs type proc (ro,relatime)
proc on /proc/irq type proc (ro,relatime)
proc on /proc/sys type proc (ro,relatime)
proc on /proc/sysrq-trigger type proc (ro,relatime)
tmpfs on /proc/asound type tmpfs (ro,relatime)
tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/timer_stats type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/sched_debug type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/scsi type tmpfs (ro,relatime)
tmpfs on /sys/firmware type tmpfs (ro,relatime)

  RUN  构建镜像时使用的命领

[root@master ~]# cat Dockerfile 
ARG   VERSION=9.3
FROM debian:${VERSION}
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
EXPOSE   22  808
ENV   APP_VERSION=1.0.0
COPY index.html /data/web/html/
ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /usr/local/src
ADD flink-1.10.0-src.tgz   /data/flink
WORKDIR /data
VOLUME  /data/mysql
RUN cd /usr/local/src && \
    tar -xf nginx-1.17.9.tar.gz && \
    mv nginx-1.17.9 nginx
[root@master ~]# docker build -t cx:0.v10 /root
Sending build context to Docker daemon  408.8MB
Step 1/12 : ARG   VERSION=9.3
Step 2/12 : FROM debian:${VERSION}
 ---> 1b3ec9d977fb
Step 3/12 : LABEL   version="1.0.0-rc3"
 ---> Using cache
 ---> fa75eedc0b84
Step 4/12 : LABEL   author="cx@github" date="2020-03-19"
 ---> Using cache
 ---> c837f32b47bd
Step 5/12 : EXPOSE   22  808
 ---> Using cache
 ---> a989df6b5cf3
Step 6/12 : ENV   APP_VERSION=1.0.0
 ---> Using cache
 ---> 7315ee41a9c9
Step 7/12 : COPY index.html /data/web/html/
 ---> Using cache
 ---> 12163b0f561a
Step 8/12 : ADD http://nginx.org/download/nginx-1.17.9.tar.gz    /usr/local/src
Downloading [==================================================>]  1.039MB/1.039MB
 ---> Using cache
 ---> 36b26842f945
Step 9/12 : ADD flink-1.10.0-src.tgz   /data/flink
 ---> Using cache
 ---> 9cc7582a2bcb
Step 10/12 : WORKDIR /data
 ---> Using cache
 ---> 08b2ca89e058
Step 11/12 : VOLUME  /data/mysql
 ---> Using cache
 ---> abbb95cb28fa
Step 12/12 : RUN cd /usr/local/src &&     tar -xf nginx-1.17.9.tar.gz &&     mv nginx-1.17.9 nginx
 ---> Running in d2080bb2a0c7
Removing intermediate container d2080bb2a0c7
 ---> 71c43b165b47
Successfully built 71c43b165b47
Successfully tagged cx:0.v10
[root@master ~]# docker run --name ww -it --rm cx:0.v10 /bin/sh
# ls /usr/local/src/nginx
CHANGES  CHANGES.ru  LICENSE  README  auto  conf  configure  contrib  html  man  src

  CMD 定义容器启动;类似于RUN指令,CMD指令也可用于运行任何命令或者应用程序,不过二者运行时间不同,RUN指令运行与镜像文件构造时,而CMD指令则是基于dockerfil指令构造出镜像启动容器时;CMD指令首要目的在于为启动容器指定默认要运行的程序,且运行结束,容器也就终止;不过CMD指令的命令可以被docker run 的命令行参数覆盖;在dockerfile中存在多个CMD指令,但仅最后一个生效

格式:CMD   <command>或者 CMD  ["<executale/bin/sh>","<param1-c>","<param2>"]  可以启动为ID 为1 进程 或者 CMD ["<param1>","<param2>"]

前两种语法格式的意义同RUN;第三种则用于ENTRYPOINT指令提供默认参数

[root@master image]# cat Dockerfile 
#ARG   VERSION=9.3
FROM busybox
LABEL   version="1.0.0-rc3"
LABEL   author="cx@github" date="2020-03-19"
ENV WEB_DOC_ROOT="data/web/html"
RUN mkdir -p $WEB_DOC_ROOT && \
    echo 'hijkjk' > ${WEB_DOC_ROOT}/index.html
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
[root@master image]# docker run --name web -it --rm cx:0.t1
[root@master image]# docker exec -it web /bin/sh
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 /bin/httpd -f -h data/web/html
    6 root      0:00 /bin/sh
   11 root      0:00 ps

     编写nginx

[root@master image3]# cat nginx.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 "$0"
[root@master image3]# chmod +x nginx.sh 
[root@master image3]# cat Dockerfile 
FROM nginx:1.14-alpine
ENV NGX_DOC_ROOT='/data/web/html/'
ADD nginx.sh /bin/
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ['/bin/nginx.sh']
[root@master image3]# docker build -t cx:0.t3 ./
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
bdf0201b3a05: Pull complete 
3d0a573c81ed: Pull complete 
8129faeb2eb6: Pull complete 
3dc99f571daf: Pull complete 
Digest: sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
Status: Downloaded newer image for nginx:1.14-alpine
 ---> 8a2fb25a19f5
Step 2/5 : ENV NGX_DOC_ROOT='/data/web/html/'
 ---> Running in 393a64ec4495
Removing intermediate container 393a64ec4495
 ---> 12d2ce879743
Step 3/5 : ADD nginx.sh /bin/
 ---> f18a559fceef
Step 4/5 : CMD ["/usr/sbin/nginx","-g","daemon off;"]
 ---> Running in 8cc3a5e8c3dd
Removing intermediate container 8cc3a5e8c3dd
 ---> 30b289008d9b
Step 5/5 : ENTRYPOINT ['/bin/nginx.sh']
 ---> Running in de582df13434
Removing intermediate container de582df13434
 ---> ff6ecad9b21b
Successfully built ff6ecad9b21b
Successfully tagged cx:0.t3

  USER指定运行容器时的用户名或者用户ID,RUN等指令会根据指定的用户身份;

格式:USER  daemon;当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在dockerfile中创建所需用户

HEALTHCHECK   容器健康状态监测

格式:HEALTHCHECK [OPTIONS] CMD command;  根据所执行的命令返回值是否为0来判断; 

         HEALTHCHECKNONE :禁止基础镜像中的健康检查   

         OPTION 支持的参数:-interval=DURATION(default:30s):过多久检查一次;-timeout=DURATION(default:50s)   

 

 

    

 

posted @ 2020-03-22 12:04  烟雨楼台,行云流水  阅读(428)  评论(0编辑  收藏  举报