Dockerfile配置指令详解

  • 一、FROM
  • 二、RUN
  • 三、CMD
  • 四、EXPOSE
  • 五、ENV
  • 六、ADD
  • 七、COPY
  • 八、ENTRYPOINT
  • 九、VOLUME
  • 十、USER
  • 十一、WORKDIR
  • 十二、ARG
  • 十三、ONBUILD
  • 十四、STOPSIGNAL
  • 十五、HEALTHCHECK

一、FROM

  • FROM的作用是指定基础镜像,并且必须是第一条指令。如果不已任何镜像为基础,可以写成FROM scratch
  • 在写完FROM之后,意味着下面写的指令会作为镜像的第一层开始
  • 语法:
FROM <image>     #镜像名称FROM <image>:<tag>   #镜像名称加版本名称FROM <image>:<digest> #三种写法都可以指定镜像,其中的<tag>和<digest> 是可选项,如果没有选择,默认值为latest

二、RUN

  • RUN 的作用是运行指定命令
  • RUN 的两种方式:

RUN <直接写要运行的命令>
RUN [“executable”, “param1”,“param2” ]
两种格式都可以执行命令

  • 第一种后边直接跟shell命令
    在linux操作系统上默认 /bin/sh -c ,可以在RUN后面跟指定命令执行的环境
    在windows操作系统上默认 cmd /S /C
  • 第二种是类似于函数调用。
    可将executable理解成为可执行文件,后面就是两个参数。

两种的写法对比

RUN source $HOME/.bashrc; echo $HOMERUN ["/bin/bash", "-c", "echo hello"]
#注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会使镜像建立一层,多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错
#RUN书写时的换行符是\
#如果有多条命令可以已&&写
[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
RUN echo "hello world"
#保存退出
[root@7-5 dsk]# docker build -t dsk:v0.1 . #构建镜像
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Running in 9ad6231a33f9
Removing intermediate container 9ad6231a33f9---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Running in 65df3636adda
Removing intermediate container 65df3636adda---> e5ed39a31e12
Step 4/4 : RUN echo "hello world"---> Running in 101807ffc2f4
hello world
Removing intermediate container 101807ffc2f4---> 4fc795975674
Successfully built 4fc795975674
Successfully tagged dsk:v0.1
[root@7-5 dsk]# docker images #查看构建成功
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dsk                 v0.1                4fc795975674        31 seconds ago      197MB
busybox             latest              69593048aa3a        2 months ago        1.24MB
centos              7.4                 196e0ce0c9fb        3 years ago         197MB
[root@7-5 dsk]# docker inspect dsk:v0.1    #查看新构建的镜像的详细信息
。。。。。。"Cmd": ["/bin/sh",   #默认的环境"-c","echo \"hello world\""    #可以看到执行的命令],
。。。。。。
"Labels": {       #标签"build-date": "20210828",    #可以看到都是刚才指定的"license": "GPLv2","name": "CentOS Base Image","vendor": "CentOS"
。。。。。。
"DockerVersion": "18.09.6","Author": "Alex-DSK",     #作者

第二种方式

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4MAINTAINER Alex-DSKLABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
RUN ["/bin/bash","-c","echo", "hello world"]        #这里指定了命令运行的环境
#保存退出
[root@7-5 dsk]# docker build -t dsk:v0.2 .         #再次进行构建
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/4 : RUN ["/bin/bash","-c","echo", "hello world"]---> Running in 66ff2365f1beRemoving intermediate container 66ff2365f1be---> 32646c7f01d6
Successfully built 32646c7f01d6
Successfully tagged dsk:v0.2
[root@7-5 dsk]# docker images          #查看所有镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dsk                 v0.2                32646c7f01d6        14 seconds ago      197MB
dsk                 v0.1                4fc795975674        About an hour ago   197MB
busybox             latest              69593048aa3a        2 months ago        1.24MB
centos              7.4                 196e0ce0c9fb        3 years ago         197MB
[root@7-5 dsk]# docker inspect dsk:v0.2        #查看详细信息
[{"Id": "sha256:32646c7f01d6a2c054796fbd274f3433952e0d57e30404c2121d515734c1df98","RepoTags": ["dsk:v0.2"],"RepoDigests": [],"Parent": "sha256:e5ed39a31e1203330d6c4bf1b83fc93890e390129be9dfdda98679fdd6a6e85b","Comment": "","Created": "2021-08-28T08:55:11.323150042Z","Container": "66ff2365f1befa4ea9802b957e6d5d9f2a2519b2c9d748fe3515426efafc03ef","ContainerConfig": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash",            #可以看到环境变成了/bin/bash"-c","echo","hello world"],"ArgsEscaped": true,"Image": "sha256:e5ed39a31e1203330d6c4bf1b83fc93890e390129be9dfdda98679fdd6a6e85b","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {                #标签相同"build-date": "20210828","license": "GPLv2","name": "CentOS Base Image","vendor": "CentOS"}},"DockerVersion": "18.09.6","Author": "Alex-DSK",    #作者相同"Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"ArgsEscaped": true,"Image": "sha256:e5ed39a31e1203330d6c4bf1b83fc93890e390129be9dfdda98679fdd6a6e85b","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"build-date": "20210828","license": "GPLv2","name": "CentOS Base Image","vendor": "CentOS"}},"Architecture": "amd64","Os": "linux","Size": 196638432,"VirtualSize": 196638432,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/fcf7e404142276443a764bdf9ba0d6744081172733386350ca55a9c9aef5238f/merged","UpperDir": "/var/lib/docker/overlay2/fcf7e404142276443a764bdf9ba0d6744081172733386350ca55a9c9aef5238f/diff","WorkDir": "/var/lib/docker/overlay2/fcf7e404142276443a764bdf9ba0d6744081172733386350ca55a9c9aef5238f/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:cf516324493c00941ac20020801553e87ed24c564fb3f269409ad138945948d4"]},"Metadata": {"LastTagTime": "2021-08-28T16:55:11.342476571+08:00"}}
]

三、CMD

  • CMD的功能是容器启动时要运行的命令,一般都是一些服务,在容器启动时执行的启动命令
  • 语法:
  1. CMD [“executable”,“param1”,“param2”]
  2. CMD [“param1”,“param2”]
  3. CMD command param1 param2
    第一二种都是可执行文件加上参数的形式中括号中的每个参数都必须加" “才行。
    第三种为shell的执行方式和写法(也就是可以直接写命令)
    注意:第一二中写法里包括参数的一定要用双引号,就是”,不能是单引号。千万不能写成单引号。
    原因是参数传递后,docker解析的是一个JSON array

RUN & CMD的区别

不要把RUN和CMD搞混了。
RUN是构建容器时就运行的命令以及提交运行结果
CMD是容器启动时执行的命令,在构建时并不运行,构建时仅仅指定了这个命令到底是个什么样子

需要联网

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
RUN ["yum", "-y", "install", "httpd"]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
[root@7-5 dsk]# docker build -t dsk:v0.3 .     #构建镜像
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/5 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/5 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/5 : RUN ["yum", "-y", "install", "httpd"]---> Running in 58dd40ed0ad6
Loaded plugins: fastestmirror, ovl
http://mirrors.cn99.com/centos/7.9.2009/os/x86_64/repodata/6d0c3a488c282fe537794b5946b01e28c7f44db79097bb06826e1c0c88bad5ef-primary.sqlite.bz2: [Errno 12] Timeout on http://mirrors.cn99.com/centos/7.9.2009/os/x86_64/repodata/6d0c3a488c282fe537794b5946b01e28c7f44db79097bb06826e1c0c88bad5ef-primary.sqlite.bz2: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')
Trying other mirror.
Determining fastest mirrors* base: mirrors.bupt.edu.cn* extras: mirrors.bupt.edu.cn* updates: mirrors.bupt.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-97.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-97.el7.centos for package: httpd-2.4.6-97.el7.centos.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-97.el7.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-97.el7.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-7.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-97.el7.centos will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency ResolutionDependencies Resolved================================================================================Package            Arch         Version                    Repository     Size
================================================================================
Installing:httpd              x86_64       2.4.6-97.el7.centos        updates       2.7 M
Installing for dependencies:apr                x86_64       1.4.8-7.el7                base          104 kapr-util           x86_64       1.5.2-6.el7                base           92 kcentos-logos       noarch       70.0.6-3.el7.centos        base           21 Mhttpd-tools        x86_64       2.4.6-97.el7.centos        updates        93 kmailcap            noarch       2.1.41-2.el7               base           31 kTransaction Summary
================================================================================
Install  1 Package (+5 Dependent packages)Total download size: 24 M
Installed size: 32 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/updates/packages/httpd-tools-2.4.6-97.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for httpd-tools-2.4.6-97.el7.centos.x86_64.rpm is not installed
Public key for apr-util-1.5.2-6.el7.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total                                              162 kB/s |  24 MB  02:33
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5Package    : centos-release-7-4.1708.el7.centos.x86_64 (@CentOS)From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionInstalling : apr-1.4.8-7.el7.x86_64                                       1/6 Installing : apr-util-1.5.2-6.el7.x86_64                                  2/6 Installing : httpd-tools-2.4.6-97.el7.centos.x86_64                       3/6 Installing : centos-logos-70.0.6-3.el7.centos.noarch                      4/6 Installing : mailcap-2.1.41-2.el7.noarch                                  5/6 Installing : httpd-2.4.6-97.el7.centos.x86_64                             6/6 Verifying  : mailcap-2.1.41-2.el7.noarch                                  1/6 Verifying  : apr-1.4.8-7.el7.x86_64                                       2/6 Verifying  : apr-util-1.5.2-6.el7.x86_64                                  3/6 Verifying  : httpd-2.4.6-97.el7.centos.x86_64                             4/6 Verifying  : httpd-tools-2.4.6-97.el7.centos.x86_64                       5/6 Verifying  : centos-logos-70.0.6-3.el7.centos.noarch                      6/6 Installed:httpd.x86_64 0:2.4.6-97.el7.centos                                            Dependency Installed:apr.x86_64 0:1.4.8-7.el7                                                      apr-util.x86_64 0:1.5.2-6.el7                                                 centos-logos.noarch 0:70.0.6-3.el7.centos                                     httpd-tools.x86_64 0:2.4.6-97.el7.centos                                      mailcap.noarch 0:2.1.41-2.el7                                                 Complete!
Removing intermediate container 58dd40ed0ad6---> 977eb70b6c26
Step 5/5 : CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]---> Running in 79c5725e37d6
Removing intermediate container 79c5725e37d6---> 0edfa3c9b4ce
Successfully built 0edfa3c9b4ce
Successfully tagged dsk:v0.3
[root@7-5 dsk]# docker run -d --name test --rm dsk:v0.3
[root@7-5 dsk]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
24d7d83e542e        dsk:v0.3            "/usr/sbin/httpd -D …"   6 seconds ago       Up 5 seconds                                    test

显示的就是最后CMD运行的命令,不过太长了就隐藏了

四、EXPOSE

  • EXPOSE的作用是指定容器运行时监听的端口,但并不会指定主机监听的端口
  • 如果想要主机跟容器之间的端口有映射关系,必须在容器启动的时候加上-P或者-p选项
[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
RUN echo "dsk"
EXPOSE 8080/tcp
CMD echo "dsk2"
#保存退出
[root@7-5 dsk]# docker build -t dsk:expose .       #再次进行构建,因为使用的dockerfile文件只是增加了指令,所以第二次构建特别快,这是因为docker有缓存构建,有之前的缓存,相当于只加了一个指令
Sending build context to Docker daemon  2.048kB
Step 1/6 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/6 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/6 : LABEL name="CentOS Base Image"     vendor="CentOS"     license---> Using cache---> e5ed39a31e12
Step 4/6 : RUN echo "dsk"---> Running in 9bf77100717e
dsk
Removing intermediate container 9bf77100717e---> c23500168e5d
Step 5/6 : EXPOSE 8080/tcp---> Running in 4f5a41d08de7
Removing intermediate container 4f5a41d08de7---> b8a927e7edd6
Step 6/6 : CMD echo "dsk2"---> Running in 19bf2048207b
Removing intermediate container 19bf2048207b---> 3d9dfea388ba
Successfully built 3d9dfea388ba
Successfully tagged dsk:expose
[root@7-5 dsk]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED
dsk                 expose              3d9dfea388ba        7 seconds ago
dsk                 v0.3                0edfa3c9b4ce        3 hours ago
dsk                 v0.2                32646c7f01d6        4 hours ago
dsk                 v0.1                4fc795975674        5 hours ago
busybox             latest              69593048aa3a        2 months ago
centos              7.4                 196e0ce0c9fb        3 years ago
[root@7-5 dsk]# docker inspect dsk:expose      #查看详细信息
。。。。。。"AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {        #容器的端口"8080/tcp": {}      #新加的8080端口},"Tty": false,"OpenStdin": false,"StdinOnce": false,。。。。。。

五、ENV

  • ENV的作用是设置环境变量
  • 语法:
1. ENV <key> <value>
2. ENV <key>=<value> ...

这两个的区别就是第一种一次只能设置一个,而第二种能一次设置多个,设置环境变量有点类似于自定义变量

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
ENV name=dsk age=18 pv=123456
[root@7-5 dsk]# docker build -t dsk:ENV .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/4 : ENV name=dsk age=18 pv=123456---> Running in 389956eacbe4
Removing intermediate container 389956eacbe4---> fe00f0a9898e
Successfully built fe00f0a9898e
Successfully tagged dsk:ENV
[root@7-5 dsk]# docker run -it dsk:ENV /bin/bash       #创建并进入容器
[root@2eacfa184188 /]# echo $name      #进行测试
dsk
[root@2eacfa184188 /]# echo $age
18
[root@2eacfa184188 /]# echo $pv
123456
[root@2eacfa184188 /]# exit
exit

六、ADD

  • ADD的作用是把文件复制到镜像中,如果是压缩文件,会自动解压,相当于scp命令,只是ADD不需要进行验证
  • 语法:
1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"]
<dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
<src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
如果把<src>写成一个url,那么ADD就类似于wget命令

写法示例:

ADD test relativeDir/
ADD test /relativeDir
ADD http://example.com/foobar /

尽量不要把写成一个文件夹,如果是一个文件夹,会复制整个目录的内容,包括文件系统元数据

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
ADD ["dsk.txt","/root/"]
[root@7-5 dsk]# echo "dsk" > dsk.txt
[root@7-5 dsk]# docker build -t dsk:ADD .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/4 : ADD ["dsk.txt","/root/"]---> bebae120fbc0
Successfully built bebae120fbc0
Successfully tagged dsk:ADD
[root@7-5 dsk]# docker run -it dsk:ADD /bin/bash
[root@678dadc2b88e /]# cat /root/aaa.txt
cat: /root/aaa.txt: No such file or directory
[root@678dadc2b88e /]# cd /root/
[root@678dadc2b88e ~]# ls
anaconda-ks.cfg  dsk.txt  original-ks.cfg
[root@678dadc2b88e ~]# cat dsk.txt
dsk
[root@678dadc2b88e ~]# exit
exit

七、COPY

  • COPY同样也是复制命令
  • 语法:
1. COPY <src>... <dest>
2. COPY ["<src>",... "<dest>"]
与ADD的区别
COPY的<src>只能是本地文件,并且不能解压,其他用法一致

八、ENTRYPOINT

  • ENTRYPOINT的作用是启动时的默认命令
  • 语法:
  1. ENTRYPOINT [“executable”, “param1”, “param2”]
  2. ENTRYPOINT command param1 param2
    第一种就是可执行文件加参数
    第二种就是写shell
  • 与CMD比较,两个命令可以配合使用

相同点:

  1. 两个命令只能写一条,如果写了多条只会有最后一条生效
  2. 都是容器启动时才运行,运行的时机都是相同的
    不同点:
    ENTRYPOINT不会被运行的命令覆盖,而CMD则会被覆盖
  • 注意:

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
#因为CMD不是完整的指令,这里的-c最后会变成ENTRYPOINT指令命令的参数

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ls -al
#如果我们在Dockerfile中同时写了ENTRYPOINT与CMD,并且CMD是一个完整的指令,那么他们谁在后面谁生效
所有CDM生效

先使用CMD指令

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
CMD echo "=dsk666"
#保存退出
[root@7-5 dsk]# docker build -t dsk:ENTRYPOINT .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/4 : CMD echo "dsk666"---> Running in 2091bb85e413
Removing intermediate container 2091bb85e413---> dc39b38ade00
Successfully built dc39b38ade00
Successfully tagged dsk:ENTRYPOINT
[root@7-5 dsk]# docker run --name a1 --rm -it dsk:ENTRYPOINT /bin/bash -c  'echo hello world'
#创建一个容器a1,启动后删除,启动时执行命令echo hello world,发现这个命令覆盖了CMD的echo命令

使用ENTRYPOINT命令

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
ENTRYPOINT echo "1234"
[root@7-5 dsk]# docker build -t dsk:ENTRYPOINT2 .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/4 : ENTRYPOINT echo "1234"---> Running in aff8d4d08deb
Removing intermediate container aff8d4d08deb---> 121ca4f53f12
Successfully built 121ca4f53f12
Successfully tagged dsk:ENTRYPOINT2
[root@7-5 dsk]# docker run --name b1 --rm -it dsk:ENTRYPOINT2 /bin/bash -c 'echo hello world'
1234
#创建容器,同样的启动后删除,启动时执行echo hello world,发现最后执行的还是ENTRYPOINT的 echo "1234",启动容器时指定的命令并没有覆盖在Dockerfile的命令

九、VOLUME

  • VOLUME的作用是实现挂载功能,可以将本地文件夹或者其他容器的文件挂载到当前容器中
  • 语法:

VOLUME ["/data"]

说明:

["/data"]可以是一个JsonArray(数组) ,也可以是多个值。所以如下几种写法都是正确的

VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db

  • 一般的使用场景为需要持久化存储数据时,容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失,所以当数据需要持久化时可以使用这个命令。
  • 示例:
[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
VOLUME /root/
#保存退出
[root@7-5 dsk]# docker build -t dsk:VOLUME .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/4 : VOLUME /root/---> Running in e9ed4ef53f31
Removing intermediate container e9ed4ef53f31---> 53cb390d779e
Successfully built 53cb390d779e
Successfully tagged dsk:VOLUME
[root@7-5 dsk]# docker run -it --name VOLUME dsk:VOLUME /bin/bash
[root@10d4fbabf664 /]# cd
[root@10d4fbabf664 ~]# ls -l
total 8
-rw------- 1 root root 3407 Sep 11  2017 anaconda-ks.cfg
-rw------- 1 root root 3221 Sep 11  2017 original-ks.cfg
再开启一个终端
[root@7-5 volumes]# docker inspect VOLUME
。。。。。。
[root@7-5 volumes]# cd /var/lib/docker/volumes/c34c6b1a670ad4cef6ab4c4e1b2b8e63b9a4dd02bdf6fb028f9cb3f8842327df/_data/
[root@7-5 _data]# ls
anaconda-ks.cfg  original-ks.cfg
[root@7-5 _data]# echo "aaaa" > aaa.txt
返回之前的终端查看
[root@10d4fbabf664 ~]# ls
aaa.txt  anaconda-ks.cfg  original-ks.cfg
[root@10d4fbabf664 ~]# exit
exit

十、USER

  • USER的作用是设置启动容器的用户,可以是用户名或UID号
  • 语法:
USER daemo
USER UID
注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT等指令的命令都会以这个用户去运行

十一、WORKDIR

  • WORKDIR的作用是设置工作目录,设置之后,容器启动就会进入设置的目录中
  • 语法:

WORKDIR /path/to/workdir
对RUN,CMD,ENTRYPOINT,COPY,ADD指令生效。如果不存在则会创建,也可以设置多次。

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
WORKDIR  /root/aaa
[root@7-5 dsk]# docker build -t dsk:WORKDIR .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/4 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/4 : WORKDIR /root/aaa---> Running in 6b3b597535e9
Removing intermediate container 6b3b597535e9---> 400ddd989e43
Successfully built 400ddd989e43
Successfully tagged dsk:WORKDIR
[root@7-5 dsk]# docker run -it dsk:WORKDIR /bin/bash
[root@1b19294f27fb aaa]# pwd       #可以看到已开启容器就进入了Dockerfile设置的工作目录当中
/root/aaa
[root@1b19294f27fb aaa]# exit
exit

WORKDIR也可以引入变量

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
ENV aaa=/root/aaa
WORKDIR $aaa
[root@7-5 dsk]# docker build -t dsk:WORKDIR2 .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/5 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/5 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/5 : ENV aaa=/root/aaa---> Running in e4c672c5c62d
Removing intermediate container e4c672c5c62d---> 6f74af6221f6
Step 5/5 : WORKDIR $aaa---> Running in ba6e7f206ad8
Removing intermediate container ba6e7f206ad8---> af2919ca692f
Successfully built af2919ca692f
Successfully tagged dsk:WORKDIR2
[root@7-5 dsk]# docker run -it dsk:WORKDIR2 /bin/bash
[root@1c3f23c44aad aaa]# pwd       可以看到也进入成功
/root/aaa
[root@1c3f23c44aad aaa]# exit
exit

十二、ARG

  • ARG的作用是设置变量命令
  • 语法:
    ARG [=]

设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg =来指定参数
如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning(警告)
警告如下:

[Warning] One or more build-args [foo] were not consumed.

我们可以定义一个或多个参数,如下:
FROM busybox
ARG user1
ARG buildno
也可以给参数一个默认值:
FROM busybox
ARG user1=someuser
ARG buildno=1
如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
ARG name
ADD $name /root/
[root@7-5 dsk]# ls     #提前在Dockerfile的同一个目录中创建好文件
Dockerfile  dsk.txt
[root@7-5 dsk]# docker build  --build-arg name=dsk.txt -t dsk:ARG .       #指定name值为dsk.txt
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/5 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/5 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/5 : ARG name---> Running in 9d21886c60da
Removing intermediate container 9d21886c60da---> b8917d742d97
Step 5/5 : ADD $name /root/---> d95d35544a46
Successfully built d95d35544a46
Successfully tagged dsk:ARG
[root@7-5 dsk]# docker run -it dsk:ARG /bin/bash       #创建开启并进入容器
[root@2a3b28aff5dc /]# cd
[root@2a3b28aff5dc ~]# ls -l       #可以看到有一个dsk.txt文件
total 12
-rw------- 1 root root 3407 Sep 11  2017 anaconda-ks.cfg
-rw-r--r-- 1 root root    4 Aug 28 14:14 dsk.txt
-rw------- 1 root root 3221 Sep 11  2017 original-ks.cfg
[root@2a3b28aff5dc ~]# cat dsk.txt
dsk
[root@2a3b28aff5dc ~]# exit
exit

指定ARG指令变量的默认值

[root@7-5 dsk]# vim Dockerfile
FROM centos:7.4
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \vendor="CentOS" \license="GPLv2" \build-date="20210828"
ARG name=dsk.txt
ADD $name /root/
[root@7-5 dsk]# docker build -t dsk:ARG2 .     #构建镜像,这次不指定变量值,使用默认
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM centos:7.4---> 196e0ce0c9fb
Step 2/5 : MAINTAINER Alex-DSK---> Using cache---> 99ec14179b55
Step 3/5 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Using cache---> e5ed39a31e12
Step 4/5 : ARG name=dsk.txt---> Running in deb11263c3c1
Removing intermediate container deb11263c3c1---> 1a89d983a929
Step 5/5 : ADD $name /root/---> 817129e8d58c
Successfully built 817129e8d58c
Successfully tagged dsk:ARG2
[root@7-5 dsk]# docker run -it dsk:ARG2 /bin/bash      #开启并启动容器
[root@dd1a0963d5ef /]# cd
[root@dd1a0963d5ef ~]# cat dsk.txt         #有数据
dsk
[root@dd1a0963d5ef ~]# exit
exit

十三、ONBUILD

  • ONBUILD指令只对当前镜像的子镜像生效
  • 语法

ONBUILD [INSTRUCTION]
这个指令只对当前镜像的子镜像生效。
比如当前镜像为A,在Dockerfile种添加:
ONBUILD RUN ls -al
这个 ls -al 命令不会在A镜像构建或启动的时候执行,此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行。

十四、STOPSIGNAL

  • STOPSIGNAL的作用是当容器退出时给系统发送什么样的指令
  • 语法:

STOPSIGNAL signal

十五、HEALTHCHECK

  1. HEALTHCHECK [OPTIONS] CMD command
  2. HEALTHCHECK NONE
    第一个的功能是在容器内部运行一个命令来检查容器的健康状况
    第二个的功能是在基础镜像中取消健康检查命令
    [OPTIONS]的选项支持以下三中选项:
    –interval=DURATION:两次检查默认的时间间隔为30秒
    –timeout=DURATION:健康检查命令运行超时时长,默认30秒
    –retries=N:当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3
    注意:
    HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。
    CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:
    0: success :表示容器是健康的
    1: unhealthy :表示容器已经不能工作了
    2: reserved :保留值
    健康检查命令是:curl -f http://localhost/ || exit 1 ,也可以编写脚本,这个是检测80端口网站的

上传镜像nginx

[root@7-5 ~]# docker load < nginx
764055ebc9a7: Loading layer [============================================
ace9ed9bcfaf: Loading layer [============================================
48b4a40de359: Loading layer [============================================
c553c6ba5f13: Loading layer [============================================
d97733c0a3b6: Loading layer [============================================
9d1af766c818: Loading layer [============================================
Loaded image: nginx:latest
[root@7-5 ~]# docker images
nginx               latest              4cdc5dd7eaad        7 weeks ago
[root@7-5 dsk]# vim Dockerfile
FROM nginx:latest
MAINTAINER Alex-DSK
LABEL name="CentOS Base Image" \    vendor="CentOS" \license="GPLv2" \build-date="20210828"
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1         #进行容器健康检测,每隔5秒检测一次,超时时间为3秒,检测的命令为curl -f http://localhost/ || exit 1,即如果无法访问容器本地的网站,则exit 1
[root@7-5 dsk]# docker build -t dsk:HEALTHCHECK .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM nginx:latest---> 4cdc5dd7eaad
Step 2/4 : MAINTAINER Alex-DSK---> Running in bdfc63810432
Removing intermediate container bdfc63810432---> 9aab00e7d52f
Step 3/4 : LABEL name="CentOS Base Image"     vendor="CentOS"     license="GPLv2"     build-date="20210828"---> Running in 9ba75f3a91d2
Removing intermediate container 9ba75f3a91d2---> ff1d8e69036e
Step 4/4 : HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1---> Running in e5dc991773a6
Removing intermediate container e5dc991773a6---> aac4e6b83ff1
Successfully built aac4e6b83ff1
Successfully tagged dsk:HEALTHCHECK
[root@7-5 dsk]# docker run -it --name HEALTHCHECK -P dsk:HEALTHCHECK /bin/bash     #使用HEALTHCHECK镜像启动容器#复制一个终端
[root@7-5 ~]# docker ps        #查看正在运行的容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS                   NAMES
02d496837a1e        dsk:HEALTHCHECK     "/docker-entrypoint.…"   9 seconds ago       Up 8 seconds (health: starting)   0.0.0.0:32768->80/tcp   HEALTHCHECK
#可以看到在STATUS这一项中,容器为health表示健康
回到之前的终端
root@02d496837a1e:/# nginx -s stop     #关闭Nginx
2021/08/29 06:29:44 [notice] 34#34: signal process started
2021/08/29 06:29:44 [error] 34#34: open() "/var/run/nginx.pid" failed (2: No such file or directory)
nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory)
去复制的终端查看
[root@7-5 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                   NAMES
02d496837a1e        dsk:HEALTHCHECK     "/docker-entrypoint.…"   29 seconds ago      Up 27 seconds (unhealthy)   0.0.0.0:32768->80/tcp   HEALTHCHECK
#显示unhealthy表示不健康

Dockerfile配置指令详解相关推荐

  1. 九爷带你了解 nginx 日志配置指令详解

    nginx日志配置指令详解 日志对于统计排错来说非常有利的. 本文总结了nginx日志相关的配置如 access_log.log_format.open_log_file_cache.log_not_ ...

  2. nginx日志配置指令详解

    日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_subreq ...

  3. Dockerfile 指令详解1

    Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 复制 ...

  4. AndroidManifest.xml文件配置教程及相关指令详解

    AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...

  5. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  6. 从一份配置清单详解Nginx服务器配置

    概述 在前面<Nginx服务器开箱体验> 一文中我们从开箱到体验,感受了一下Nginx服务器的魅力.Nginx是轻量级的高性能Web服务器,提供了诸如HTTP代理和反向代理.负载均衡.缓存 ...

  7. Dockerfile使用方法详解

    Dockerfile使用方法详解 一.Dockerfile介绍 1.Dockerfile 2.创建镜像方法 3.dockerfile的组成部分 二.Dockerfile指令 1.常用指令 2.其他指令 ...

  8. 大数据WEB阶段(十三)JSP(一)JSP基础、JSP指令详解、四大域九大隐式对象总结

    JSP基础.指令.四大作用域九大隐式对象总结 (一)JSP基础 一.JSP概述 jsp其实是java动态页面技术 HTML可以用来组织页面但是HTML是一种静态web资源技术无法嵌入动态数据. Ser ...

  9. python定时任务crontab_【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. cron 系统调度 ...

最新文章

  1. Pygame实战:风靡全球的经典泡泡龙小游戏来袭,你会喜欢嘛?(附源码)
  2. 【C 语言】文件操作 ( 读取文件中的结构体数组 | feof 函数使用注意事项 )
  3. Excel多条件求和 SUMPRODUCT函数用法详解
  4. 传递对象_看懂Xlua实现原理——从宏观到微观(1)传递c#对象到Lua
  5. windows下修改tomcat的startup.bat脚本文件后台运行
  6. c#调api串口通讯
  7. Android学习之网上商城(下)
  8. Go单元测试从入门到放弃—0.单元测试基础
  9. 安全模式:天猫 App 启动保护实践
  10. 爬虫(12)-爬虫爬取安居客二手房和新房信息
  11. 全球最大智慧集装箱码头如何做到“空无一人”?
  12. 怎么修改照片文件的大小?教你一招改变图片大小尺寸
  13. UINO优锘:DCV产品发展历程
  14. G6 3.1 线条的属性
  15. matplotlib:图形绘制常用增加修饰和设置参数
  16. MD5在文件中的使用
  17. 【腾讯位置服务】使用地点云实现企业官网中的门店地图
  18. 获取安卓系统自带CA证书
  19. 【技巧】ApiPost生成word格式的接口文档,接口文档合并操作
  20. 解决swagger几种报错问题

热门文章

  1. 微信电脑版字体模糊(或文字太小)怎么调整
  2. 用python脚本实现JRA-55数据批量下载
  3. python文字转语音输出_Python 文本转语音
  4. Python:让繁琐工作自动化
  5. pagehelper oracle用法,Mybatis-PageHelper使用方法
  6. OpenCV从入门到精通——边缘检测算法Canny
  7. 多个audio连续播放
  8. [CareerCup] 18.3 Randomly Generate Integers 随机生成数字
  9. Android Killer 高版本卡死,Android Killer反编译卡死的一个解决方案
  10. 2022.06.26 华为od机试真题