docker Dockerfile里使用的命令说明
一,dockerfile格式
- 注释#
- 指令 参数
- 指令不区分大小写,但是推荐全部大写指令。
- 指令从上到下顺序被执行
- 第一个指令必须是【FROM】,指示出要使用的基础镜像。
- 执行docker file时,如果使用到了别的配置文件,这些配置文件不能放到【执行docker file目录】的父目录,但可以放到子目录。
- 在执行docker file目录下,可以放一个隐藏文件(.dockerignore),里面存放的是build时不需要的文件。可以使用通配符去指定。比如,某个子目录里10个文件,build时有3个文件不需要,你在docker file里引用的是目录名,所以这10个文件都被引入进来了。但如果把不需要的3个文件,加入到.dockerignore文件里,build时就它们3个排除了。
- 文件名必须是:【Dockerfile】或者【dockerfile】
二,dockerfile 命令
目录:
命令 | 简要说明 |
---|---|
FROM | 指定基础镜像(base image) |
MAINTAINER | 不推荐使用,被LABLE替代了 , 用于让dockerfile制作者提供本人的详细信息 |
LABEL | 用于指定元数据,比如作者,文件大小 等 |
COPY | 复制宿主机里的文件或目录到:要build出的image的文件系统的某个目录里 |
ADD | 类似COPY,比COPY多了支持压缩类文件的自动解压和从URL下载 |
WORKDIR | 用于dockerfile中所有RUN,CMD,ENTRYPOINT,COPY和ADD指定设定的工作目录。 |
VOLUME | 和run -v类似,但只能指定image里的某个目录,而不能指定宿主机的目录。 |
EXPOSE | 和-p选项类型,指定容器要暴漏给外部的端口,但不能指定宿主机的端口 |
ENV | 在容器的系统了定义环境变量,ENV,ADD,COPY等指令可以使用。 |
RUN | 在build执行过程中,执行基础镜像里可以执行的任何shell命令 |
CMD | 在docker build时不被运行,而是在docker run时运行。 |
ENTRYPOINT | 类似CMD指令,用于为容器指定默认运行程序。 |
USER | docker run,CMD,ENTRYPOINT执行的时候,所使用的用户名或者UID |
HEALTHCHECK | 定期查看容器里运行的进程是否还在工作状态 |
SHELL | 指定用哪个shell去运行RUN |
STOPSIGNAL | 【docker stop 容器名】默认是个PID为1的进程发送15号信号 |
ARG | 在build时,通过【--build-arg】传入到dockerfile里面的变量 |
ONBUILD | 当别人拿你做成的image作为base image,执行build时,ONBUILD命令才会执行。 |
FROM命令:repository为基础镜像(base image)的名称,tag为base image的标签,不指定就是latest。如果不指定registry,就从docker hub上拉取。
FROM <registry><repository>[:<tag>]
FROM <registry><repository>@<digest>
当从外部registry拉image时,image有可能被别人替换了,但是repository名字相同,所以不安全。digest是image的hash值,所以指定了digest就不会被别人替换掉了。
MAINTAINER(不推荐使用,被LABLE替代了)命令:用于让dockerfile制作者提供本人的详细信息。
MAINTAINER可以出现在任何位置,但推荐放到FROM后面。
- MAINTANIER "magedu <mage@magedu.com>"
LABEL命令:用于指定元数据,比如作者,文件大小等。
- 用法:LABEL <key>=<value> <key>=<value> ...
COPY命令:复制宿主机里的文件或目录到:要build出的image的文件系统的某个目录里。
语法:
- COPY <src> ... <dest>
- COPY ["<src>", ... "<dest>"]
- src:源文件或目录,可以使用相对路径(相对dockerfile所在的路径),支持使用通配符
- dest:目标路径,建议绝对路径,否则,COPY指定则以WORKDIR为起始路径。
- 注意:在路径中有空白字符时,使用第二种格式,理由是空白字符是第一种格式的目录分隔符。
文件复制准则:
src必须是dockerfile里面的文件或目录,不能是其父目录中的文件或路径。
如果src是目录,则其内部文件或子目录都会被递归复制,但src目录自身不会被复制。
相当于:cp src/* /dest。
如果指定了多个src,或在src中使用了通配符,则dest必须是目录,且必须以/结尾。
如果dest事先不存在,它将会被自动创建,其父目录也会被一并创建。
三,build特点:每执一行命令,都会新建一个层,层越多,性能越不好,所以能把命令放在一行,就尽量放在一行。
比如COPY命令,如果目标目录相同,则最好只使用一次COPY。虽然使用多次COPY也不出错误,但是会多出层,性能不好。
docker build命令
获取帮助信息:
- PATH:【Dockerfile】或者【dockerfile】文件所在的目录。
- -c:制作过程使用多少CPU
- -m:制作过程使用多少内存。
- -t:指定image的repository和tag。
# docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable
unlimited swap
--network string Set the networking mode for the RUN instructions
during build (default "default")
--no-cache Do not use cache when building the image
--pull Always attempt to pull a newer version of the image
-q, --quiet Suppress the build output and print image ID on success
--rm Remove intermediate containers after a successful
build (default true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list Name and optionally a tag in the 'name:tag' format
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
dockerfile 例子1:拷贝一个文件。
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
COPY index.html /data/html/
build一下上面的dockerfile 试试,使用-t
,来指定image的名字和tag,发现build成功了。
# docker build -t tinyhttpd:v0.01 ./
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM busybox:latest
---> b534869c81f0
Step 2/4 : MAINTAINER "magedu <mage@magedu.com>"
---> Using cache
---> 5c5a1c47716c
Step 3/4 : LABEL maintainer="magedu <mage@magedu.com>"
---> Using cache
---> 88b87ddfdb22
Step 4/4 : COPY index.html /data/html/
---> Using cache
---> 59b7dd6c3eb8
Successfully built 59b7dd6c3eb8
Successfully tagged tinyhttpd:v0.01
启动这个image,看看里面有没有/data/html/index.html
# sudo docker run --name b1 --rm tinyhttpd:v0.01 cat /data/html/index.html
<h1>http server</h1>
dockerfile 例子2:拷贝一个目录。
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/
执行build:
docker build -t tinyhttpd:v0.02 ./
Sending build context to Docker daemon 30.21kB
Step 1/5 : FROM busybox:latest
---> b534869c81f0
Step 2/5 : MAINTAINER "magedu <mage@magedu.com>"
---> Using cache
---> 5c5a1c47716c
Step 3/5 : LABEL maintainer="magedu <mage@magedu.com>"
---> Using cache
---> 88b87ddfdb22
Step 4/5 : COPY index.html /data/html/
---> Using cache
---> 59b7dd6c3eb8
Step 5/5 : COPY yum.repos.d /etc/yum.repos.d/
---> 99d306a25cc7
Successfully built 99d306a25cc7
Successfully tagged tinyhttpd:v0.02
验证:
docker run --name b1 -it --rm tinyhttpd:v0.02 ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-Sources.repo
CentOS-Base.repo_20191129 CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo
CentOS-Debuginfo.repo docker-ce.repo
CentOS-Media.repo
二,dockerfile 命令(续)
ADD命令:类似COPY,比COPY多了支持压缩类文件的自动解压和从URL下载
语法:
- ADD <src> ... <dest>
- ADD ["<src>", ... "<dest>"]
ADD准则:
- 同COPY指令
- 如果src为URL且dest不以/结尾,则src指定的文件将被下载并直接被创建为dest;如果dest以/结尾,则src指定的文件将被下载并保存为dest/<filename>
- 如果src是宿主机上的压缩文件,它将被自动展开,其行为类似
tar -x
;然而通过URL下载的压缩文件不会自动展开。 - 如果src有多个,或使用了通配符,则dest必须是以/结尾的目录路径;如果dest不以/结尾,则其被视作一个普通文件,src的内容将被直接写入dest。
例子1:使用URL
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src
确认结果:
# docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src/
nginx-1.2.9.tar.gz例子2:使用本地压缩文件
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
ADD nginx-1.2.9.tar.gz /usr/local/src/
确认结果:
# docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src/nginx-1.2.9
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
WORKDIR命令:用于dockerfile中所有RUN,CMD,ENTRYPOINT,COPY和ADD指定设定的工作目录。
WORKDIR可以出现多次,这些命名去上面去找离它最近的WORKDIR作为相对路径的起始。
语法:
- WORKDIR <PATH>
- WORKDIR 系统环境变量(比如:$MYENV)。
例子:
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD nginx-1.2.9.tar.gz ./src1/
确认结果:
sudo docker run --name b1 --rm tinyhttpd:v0.03 ls /usr/local/src1/nginx-1.2.9
[sudo] password for ys:
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
VOLUME:和run -v类似,但只能指定image里的某个目录,而不能指定宿主机的目录。
语法:
- VOLUME <mountpoint>
- VOLUME ["mountpoint1", "mountpoint2"]
注意:如果image挂载点目录下有文件,则启动容器后,会把挂载点下的文件拷贝到宿主机。
例子:
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD nginx-1.2.9.tar.gz ./src/
VOLUME /usr/local/src
确认结果:由于image的/usr/local/src目录下有nginx-1.2.9,所以nginx-1.2.9会被拷贝到宿主机。
# docker run --name b1 -it --rm tinyhttpd:v0.03
# ls /var/lib/docker/volumes/1240925e87efaa5d9ed375b268a6d804c29013c04792f9a0dde9e135aa7e9f9e/_data/
nginx-1.2.9
EXPOSE:和-p选项类型,指定容器要暴漏给外部的端口,但不能指定宿主机的端口,因为在作dockerfile的时候,无法确定此image运行在什么宿主机上。也就无法知道宿主机上哪些端口可以使用。所以是随机去找宿主机里可以使用的端口。
注意:即使使用了EXPOSE命令,但如果RUN时不加
-P
选项的话,端口也不会被暴露出去的。语法:EXPOSE <port>[/protocol] <port>[/protocol]
- protocol是传输层协议,tcp或者udp,不知道就是tcp
- 可以一次指定多个端口,比如:EXPOSE 5255 5254/udp
例子:
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
COPY index.html /data/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD nginx-1.2.9.tar.gz ./src/
VOLUME /usr/local/src
EXPOSE 80
确认结果:
启动时先不指定
-P
,用docker port查看,发现没有端口。# docker run --name b1 --rm tinyhttpd:v0.03 /bin/httpd -f -h /data/html/
# docker port b1
启动时先指定
-P
,用docker port查看,发现有端口。# docker run --name b1 --rm -P tinyhttpd:v0.03 /bin/httpd -f -h /data/html/
# docker port b1
80/tcp -> 0.0.0.0:32768
EXPOSE的作用是:默认想暴露的端口,在启动的时候,可以使用
-p
去覆盖EXPOSE指定的端口。
ENV:在容器的系统了定义环境变量,ENV,ADD,COPY等指令可以使用。
语法:
- ENV <key> <value>
- ENV <key>=<value> ...
- 第一种格式,<key>之后所以内容都被视作为value,只能定义一个变量。
- 第二种格式,定义多个变量,如果value中包含空格,使用\进行转义,也可以通过对value加引号进行标识;另外,\也用做换行。
- 定义多个变量时,要使用第二种格式,以便不会增加额外的层,导致image过大。
例子:${DOC_ROOT:-/data/html/}的用法是,if(DOC_ROOT 没有值) {DOC_ROOT=/data/html/}
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
ENV DOC_ROOT=/data/html/ \
WEB_SERVER_PACKAGE="/nginx-1.2.9"
COPY index.html ${DOC_ROOT:-/data/html/}
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.2.9.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
VOLUME /usr/local/src
EXPOSE 80
延申,在docker run的时候也可以使用
-e
选项设置环境变量。在run的时候,通过-e,可以改变dockerfile里指定环境变量的值。
dockerfile里定义的是nginx-1.2.9,但是-e指定的nginx-1.2.3,所以WEB_SERVER_PACKAGE=/nginx-1.2.3。
# docker run --name b1 --rm -e WEB_SERVER_PACKAGE=/nginx-1.2.3 tinyhttpd:v0.03 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7a242517b02e
WEB_SERVER_PACKAGE=/nginx-1.2.3
但是,/usr/local/src里的目录还是nginx-1.2.9。因为在build的时点,image里放的就已经是nginx-1.2.9了,所以你在-e里,改变的只是环境变量的值而已。
# docker run --name b1 --rm -e WEB_SERVER_PACKAGE=/nginx-1.2.3 tinyhttpd:v0.03 ls /usr/local/src
nginx-1.2.9
RUN:在build执行过程中,执行基础镜像里可以执行的任何shell命令。如果是多个命令是有关联的话,最好写到一起。
语法:
- RUN <command>
- RUN ["executable1","arg1","executable2","arg1"]
- 例如:RUN ["/bin/bash","-c","ls","-ltr"]
例子:我们指定ADD里的src如果是压缩文件的话,不会自动解压缩,所以我们RUN一个tar命令去解压缩它。
FROM busybox:latest
MAINTAINER "magedu <mage@magedu.com>"
LABEL maintainer="magedu <mage@magedu.com>"
ENV DOC_ROOT=/data/html/ \
WEB_SERVER_PACKAGE="nginx-1.2.9"
COPY index.html ${DOC_ROOT:-/data/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE}.tar.gz /usr/local/src/
RUN cd /usr/local/src && \
tar xf ${WEB_SERVER_PACKAGE}.tar.gzRUN用途举例:先找个基础的centos镜像,然后装一个nginx,一般都是下载源代码编译安装,不是使用yum install。理由是yum会产生多余的文件。
FROM centos
RUN yum -y install epel-release && \
yum makecache && \
yum install nginx
CMD:在docker build时不被运行,而是在docker run时运行。比如nginx镜像启动的时候,那么CMD肯定是启动nginx的命令。所以CMD即使给了多个,只有最后一个生效。
语法:
CMD <command>
command通常是shell命令,而且是以/bin/sh -c来运行此命令,因此,是通过shell启动的,所以可以使用shell的特性,而且启动结束后,shell进程会自动推出,让此进程代替shell进程。所以它pid是1。
CMD ["executable1","arg1","executable2","arg1"]
executable是目录名加上可执行程序名,比如/bin/ls。它不是通过/bin/sh -c来运行,是由内核直接启动,由于不是由shell启动,所以shell里的通配符,管道,重定向等特性,全部不能用。如果想用shell特性,可以这么使用:CMD ["/bin/bash","-c","executable","arg"].
RUN的第一种和第二种用法和CMD的第一种和第二种用法一样。
CMD ["arg1","arg2"]
配合ENTRYPOINT命令使用。
例子:
FROM busybox
LABEL maintainer="mageedu <mage@magedu.com>" app="httpd" ENV WEB_ROOT="/data/web/html/" RUN mkdir -p ${WEB_ROOT} && \
echo '<h1>Busybox httpd.</h1>' > ${WEB_ROOT}/index.html CMD /bin/httpd -f -h ${WEB_ROOT}
确认结果:用inspect确认,确实是用/bin/sh -c来启动的。
"Cmd": [
"/bin/sh",
"-c",
"/bin/httpd -f -h ${WEB_ROOT}"
],
pid也是1
docker exec -it b1 /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
# printenv
HOSTNAME=e877c51f7dab
WEB_ROOT=/data/web/html/
ENTRYPOINT:
类似CMD指令,用于为容器指定默认运行程序。
与CMD不同的是,不会被docker run指定的参数覆盖(也有覆盖的办法),而且docker run指定的参数,会自动加到ENTRYPOINT命令的后面,相当于ENTRYPOINT命令的参数了。
run时使用--entrypoint string选项,可以强制替换ENTRYPOINT命令。
如果docker run时没有指定参数,则使用上面CMD的第三种格式定义的参数,作为ENTRYPOINT的参数。
如果docker run时指定了参数,CMD的第三种格式也指定了参数,ENTRYPOINT使用的是docker run时指定的参数,忽略CMD的第三种格式指定的参数。
dockerfile文件种也可以出现多个ENTRYPOINT,但只有最后一个生效。
语法:
- ENTRYPOINT <command>
- ENTRYPOINT ["executable", "param1", "param2"]
例子:在build时创建nginx的配置文件,而且在run的时候,还可以通过-e参数传递环境变量,修改监听的端口号等信息。
FROM nginx:alpine
LABEL maintainer="MageEdu <mage@magedu.com>" ENV NGX_DOC_ROOT="/data/web/html/" ADD entrypoint.sh /bin/
ADD index.html ${NGX_DOC_ROOT} CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
ENTRYPOINT命令执行的是一个自己定义的shell命令文件,内容如下。
首先用cat命令创建了一个nginx的配置文件,还使用了环境变量。
然后,调用exec系统函数,参数是CMD定义的命令:["/usr/sbin/nginx", "-g", "daemon off;"]。exec函数的作用是:启动ngxin进程,并终止当前进程(/bin/sh进程),让nginx进程取代当前的shell进程,所以nginx进程的pid是1。
"$@":shell的全部参数,也就是/usr/sbin/nginx", "-g", "daemon off;
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 "$@"
当run的时候,执行ENTRYPOINT命令,参数是CMD里定义的。
确认结果:通过-e把监听端口设置成了8080;nginx的pid是1;www.conf也被创建了。在宿主机器上执行【curl -H "Host: a6b94dae9be4" 192.0.0.2:8080】,也输出了index.html的结果。
# docker run --name b1 --rm -d -e "PORT=8080" mynignx:002
# docker exec -it b1 /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
# cat /etc/nginx/conf.d/www.conf
server {
server_name a6b94dae9be4;
listen 0.0.0.0:8080;
root /data/web/html/;
}
/ # ps
PID USER TIME COMMAND
1 root 0:00 nginx: master process /usr/sbin/nginx -g daemon off;
8 nginx 0:00 nginx: worker process
# cat /data/web/html/index.html
<h1>nginx hello</h1>
$ curl -H "Host: a6b94dae9be4" 192.0.0.2:8080
<h1>nginx hello</h1>试验一下,在run时,指定参数:/usr/sbin/nginx daemon off(故意不加-g),去覆盖CMD。因为缺少了-g,所以容器启动失败,说明了,确实覆盖CMD里定义的命令。
# docker run --name b1 --rm -d -e "PORT=8080" mynignx:002 /usr/sbin/nginx daemon off
4c88e021408c143ec45e70611c42bd715831cb9c75d6f4a00d307a7a6b53af5c
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES试验一下,使用--entrypoint "/bin/sh",覆盖ENTRYPOINT。
覆盖成功了,1号进程是/bin/sh进程;www.conf文件没有被创建;nginx进程没有被启动。
# docker run --name b1 --rm -it -e "PORT=8080" --entrypoint "/bin/sh" mynignx:002
/ # ls
bin dev home media opt root sbin sys usr
data etc lib mnt proc run srv tmp var
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
7 root 0:00 ps
/ # ls /etc/nginx/conf.d/
default.conf
ENTRYPOINT用法的最佳实践:build之前事先创建好配置文件,build时,注入到image了。就能达到动态创建各种服务的配置文件,从而解决了只是因为配置文件的不同,而不得不创建多个image的问题。
USER
使用USER的背景,不指定USER的时候,进程的所有者都是root,比如下面的nginx。当不希望是root的时候,使用此命令。
/ # ps
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
docker run,CMD,ENTRYPOINT执行的时候,所使用的用户名或者UID
默认情况下是root
语法:USER <UID> | <UserName>
UID或者UserName必须是在image里存在的,必须存在于/etc/passwd中。
HEALTHCHECK:
定期查看容器里运行的进程是否还在工作状态。docker自己会自动检查容器里的进程是否还活着,如果死了或者不在前台运行的时候,docker会自动杀死这个容器。但这是不够的,有的容器即使活着,但不能提供服务了,那也相当于死了,所以要自己定义一个命令去检查容器里运行的进程,是否还在工作。
语法:
- HEALTHCHECK [OPTION] CMD command
- OPTION:
- --interval=:检查的间隔(默认:30秒)
- --timeout=:定义超时时长(默认:30秒)
- --start-period=:等多久开始第一次健康检查(默认:0秒)
- --retries=:发现不健康了,不是立即杀死容器,而要再试验几次。再试验的次数(默认:3次)。
- 健康检查结果:
- 0:success
- 1:unhealthy
- 2:reserved(保留,为使用)
- OPTION:
- HEALTHCHECK NONE
- HEALTHCHECK [OPTION] CMD command
例子:健康检查结果是正常的。
FROM nginx:alpine
LABEL maintainer="MageEdu <mage@magedu.com>" ENV NGX_DOC_ROOT="/data/web/html/" ADD entrypoint.sh /bin/
ADD index.html ${NGX_DOC_ROOT} HEALTHCHECK --interval=3s --timeout=3s \
CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/ CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
结果确认:
# docker run --name b1 --rm mynginx:v001
127.0.0.1 - - [08/Dec/2019:13:54:18 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"
127.0.0.1 - - [08/Dec/2019:13:54:21 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"
127.0.0.1 - - [08/Dec/2019:13:54:25 +0000] "GET / HTTP/1.1" 200 612 "-" "Wget" "-"
例子:健康检查结果是不正常的。发现不正常后,直接【kill 1】。容器启动后,马上就被杀死了。
FROM nginx:alpine
LABEL maintainer="MageEdu <mage@magedu.com>" ENV NGX_DOC_ROOT="/data/web/html/" ADD entrypoint.sh /bin/
ADD index.html ${NGX_DOC_ROOT} HEALTHCHECK --interval=1s --timeout=1s --retries=1 \
CMD wget -O - -q http://${IP:-0.0.0.0}:10080/ || kill 1 CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
SHELL:指定用哪个shell去运行RUN,CMD,ENTRYPOINT的命令,默认是/bin/sh -c。
- 语法:SHELL ["executable", "parameters"]
- 可以出现多次,每次都会覆盖上一次。
STOPSIGNAL:【docker stop 容器名】默认是个PID为1的进程发送15号信号。STOPSIGNAL可以指定别的信号。
- 语法:STOPSIGNAL 信号。
ARG:
在build时,通过【--build-arg】传入到dockerfile里面的变量
dockerfile里可以有多个ARG
语法: ARG <name>[=<default value>]
可以在dockerfile里定有ARG的默认值
ARG version=1.14
例子:
FROM nginx:alpine
ARG author="MageEdu <mage@magedu.com>"
LABEL maintainer=${author}确认结果:build时,没有使用--build-arg
# docker build -t mynginx:v002 ./
# docker image inspect mynginx:v002
"Labels": {
"maintainer": "MageEdu <mage@magedu.com>"
},
确认结果:build时,使用--build-arg
# docker build --build-arg author="abc <asd@sd.com>" -t mynginx:v002 ./
# docker image inspect mynginx:v002
"Labels": {
"maintainer": "abc <asd@sd.com>"
},
ONBUILD
- build时不执行此命令。
- 当别人拿你做成的image作为base image,执行build时,ONBUILD命令才会执行。
- 语法:ONBUILD 任何dockerfile命令(除了FROM和MAINTAINER)
- ONBUILD ADD或者ONBUILD COPY要格外小心,因为你不知道别人在拿你的image做base image时,文件都放在哪里,ADD如果是远程要下载的文件是没有问题的。
c/c++ 学习互助QQ群:877684253
本人微信:xiaoshitou5854
docker Dockerfile里使用的命令说明的更多相关文章
- Dockerfile里指定执行命令用ENTRYPOING和用CMD有何不同?
结论:运行时机不太一样. RUN是在Build时运行的,先于CMD和ENTRYPOINT.Build完成了,RUN也运行完成后,再运行CMD或者ENTRYPOINT. ENTRYPOINT和CMD的不 ...
- Docker - Dockerfile - 常见命令简介
概述 感觉是个 比较重要的东西 有个疑问 我是先讲 docker build 还是 先讲 Dockerfile 穿插讲 docker build 最基本的东西 原理 -t -f docker file ...
- Docker Dockerfile简述
原文地址:https://www.cnblogs.com/cuimiemie/p/6442677.html 作用 Dockerfile的内容是一坨可以执行的代码(或者说是指令)(docker的DSL) ...
- docker rmi 导致后面的命令不执行问题 Dockerfile设置时区问题
docker rmi 导致后面的命令不执行问题 把ca=`docker rmi sendemail-service` echo $ca改成docker rmi sendemail-service -f ...
- docker Dockerfile文件的编写部分命令
镜像的构建过程:编写dockerfile文件,执行docker build 进行构建镜像,最后docker run 运行容器镜像实例. docker build -t mycentos:1.01 . ...
- docker镜像、容器以及命令操作
docker image docker image是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如centos+java7 docker image是 ...
- Docker Dockerfile 定制镜像(转)
转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...
- docker Dockerfile 创建镜像
Docker 组件 1. docker client : docker的客户端 2. docker server : docker daemon的主要组成部分,接受用户通过docker client发 ...
- 从零开始通过idea插件将一个spring boot项目部署到docker容器里运行
实操:将一个spring boot项目部署到docker容器里运行 实验需要的环境: 腾讯云+Ubuntu 16.04 x64+idea+插件docker integration+daocloud 第 ...
随机推荐
- ARTS-S centos修改hostname
hostnamectl set-hostname newhostname 重启
- 在5分钟内将Spring Boot作为Windows服务启动
分享优锐课学习笔记~来看一下如何使用Spring Boot创建Windows服务以及通过配置详细信息来快速启动并运行. 最近不得不将Spring Boot应用程序部署为Windows服务,感到惊讶的是 ...
- 【Git】405- 分享:大牛总结的 Git 使用技巧
作者:你喜欢吃青椒么 来源:juejin.im/post/5d157bf3f265da1bcc1954e6 前言 本文是参考廖雪峰老师的Git资料再加上我自己对Git的理解,记录我的Git学习历程,作 ...
- 安装mysql5.7(亲手实操)
https://files-cdn.cnblogs.com/files/yucoder/%E5%AE%89%E8%A3%85mysql5.7.pdf
- javascript基础(001)-js加减乘除注意事项(含类型转换)
一,加减乘除注意事项: 1.任意类型'+'字符串都被强转字符串 2.数字和布尔类型'+'undefined 结果为 NaN (Not a Number) 3.'-','*','/'操作会尝试把数据转为 ...
- 《Dotnet9》系列-Google ProtoBuf在C#中的简单应用
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- 【搞定Jvm面试】 面试官:谈谈 JVM 类加载过程是怎样的?
类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢? 系统加载 Class 类型的文件主要三步:加载->连接->初始化.连接过程 ...
- 实验:使用GDB查看结构体在内存中的存储方式
结构体在内存中的表示形式是怎么样的? 结构体在内存中和普通变量存储没有太大的区别. 首先我们看看,计算机如何读取普通变量: 普通变量例如int是占据4个字节,计算机读内存的时候会从起始地址开始读, ...
- Another git process seems to be running in this repository
今天在推送项目的时候git突然报如题的错误.查了一下是由于git被另外一个程序占用,产生原 原因在于Git在使用过程中遭遇了崩溃,部分被上锁资源没有被释放. 解决方案也很简单,在git中找到对应的in ...
- Litho在美团动态化方案MTFlexbox中的实践
1. MTFlexbox MTFlexbox是美团内部应用的非常成熟的一种跨平台动态化解决方案,它遵循了CSS3中提出的Flexbox规范来抹平多平台的差异.MTFlexbox适用于重展示.轻交互的业 ...