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作为基础镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [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> ....
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [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>]
1 2 3 4 5 6 7 | [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
1 2 3 4 5 6 7 8 | [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
1 2 | 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指令,仅最后一个生效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | [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上下文中路径,不能是父目录;如果源文件是目录,则其内部文件或子目录会被递归复制,但源文件目录自身不会被复制;如果指定多个源文件,或者使用通配符,则目标必须是一个目标且必须以/结尾;如果目标不存在,它会被自动创建,这包括其父目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | [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路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | [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 |
本地压缩文件测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | [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 设定工作目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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命令会在挂在卷挂在完成后将此前的索引文件复制到新挂在的卷中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | [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 构建镜像时使用的命领
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | [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指令提供默认参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | [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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
2019-03-22 iptables 防火墙