Dockerfile中常用命令汇总
语法组成:
1注释信息
2指令---参数[通常要大写|实质上不区分大小写]
3顺序执行
4第一个非注释行必须是from[基于那个基础镜像制作]
5需要一个专用目录[自己创建]
6首字目必须大写---Dockerfile
7制作镜像依赖到文件或者包组时,必须提前准备至专用目录下
.dockerignorefile--每一行中定义一个忽略文件
--创建在工作目录中
例如:pam.d/su*
.........................................................
dockerfile中的常用指令:
1FROM---指定基础镜像
基础镜像不存在会在DockerHub上拉去
使用格式:
FROM<镜像>:[tag]
FROM<镜像>@digest[校验码]
当前主机没有此镜像时,会自动去官网HUB下载
..............................................
2MAINTANIER--提供Dockerfile制作者提供本人信息
[逐渐废弃]
LABLE--替代MAINTANIER
具体使用:
LABLEmaintainer="作者信息"
使用格式:
MAINTANIER"guowei<597599150@qq.com>"
.......................................................
3COPY--把宿主机中的文件复制到镜像中去!
文件要在Dockerfile工作目录
src原文件
--支持通配符
--通常相对路径
dest目标路径
--通常绝对路径
有空白字符隔开的字串需要用"",否则会被当做两个文件!
文件复制准则:
1src必须是build上下文中的路径,不能是其父目录
2如果src是目录,则其内部文件或子目录会被递归复制
但src目录自身不会被复制
3如果指定了多个src,或在src中使用了通配符,则dest必须是一个
目录,且必须以/结尾
4如果dest实现不存在,它将会被自动创建,这包括其父目录
..............................................................
4ADD--类似COPY命令
支持URL路径----如果可以访问网络的话,会访问网络下载
到本地然后打包进镜像!
操作准则:
1如果src为URL且dest不以/结尾,则src指定的文件将被下载并
直接被创建为dest;如果dest以/结尾,则文件名URL指定的文件
将被直接下载并保存为dest/filename
2如果是压缩包会被解压,但通过URL路径获取到的tar文件不会被展开
3如果src有多个,或其间接或直接使用了通配符,则dest必须是一个
以/结尾的目录路径,如果dest不以/结尾,则其被视为一个普通文件
src的内容将被直接写入到dest中!
...............................................................
5WORKDIR--指定工作目录
每次只会影响这个指令后续的指令
ADDnginx-1.14.2.tar.gz/usr/local/src/--不受影响
WORKDIR/usr/local/src/
ADDnginx-1.14.2.tar.gz./--受影响
.............................................................
6VOLUME--卷
只能定义docker管理的卷:
VOLUME/data/mysql
运行的时候会随机在宿主机的目录下生成一个卷目录!
................................................................
7EXPOSE为容器打开指定要监听的端口以实现与外部通信
使用格式:
EXPOSE80/tcp23/udp
不加协议默认为tcp
使用-P选项可以暴露这里指定的端口!
但是宿主的关联至这个端口的端口是随机的!
..............................................................
8ENV
用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于
其后的其它命令所调用
调用格式:
$A或${A}
ENV
ENV
第一种格式中,key之后的所有内容均会被其视作
因此,一次只能设置一个变量!
第二种格式可用一次设置多个变量,每个变量为一个
的键值对,如果
也可以通过对
定义多个变量时。建议使用第二种方式,以便在同一层中完成所有功能
具体用法:
ENVJAVA_HOME/usr/local/jdk
ENVJRE_HOME$JAVA_HOME/jre
ENVCLASSPATH$JAVA_HOME/lib/:$JRE_HOME/lib/
ENVPATH$PATH:$JAVA_HOME/bin/
ENVA/web/html
COPYindex.html${A:-/web/html}
在dockerrun中传递变量:
dockerrun-e[list]传变量值
如果在dockerfile中赋值变量后也能在dockerrun中继续赋值
dockerrun--nameb1--rm-eA=xx[镜像ID]
不会影响dockerbuild的过程!
printenv--输出环境变量信息
..............................................................
9RUN命令:
使用格式:
RUN
RUN["
第一种格式中
这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使用dockerstop命令
来停止容器时,此进程接收不到信号
第二种语法格式中的参数是一个JSON格式的数组,其中
因此常见的shell操作如变量替换以及通配符替换将不会进行不过如果要运行的命令依赖于
此shell特性的话,可以将其替换为下面的格式:
RUN["/bin/bash","-c","
........................................................................
10CMD命令:运行于dockerrun中
语法有三种写法
1.CMD["executable","param1","param2"]--启动为ID为1的进程
具体实例:
CMD["/bin/sh","-c","/bin/httpd","-f","-h/web/html]
2.CMD["param1","param2"]
3.CMDcommandparam1param2--直接运营为shell的子进程
param*=执行参数
例如第二种:
CMD["nginx"]
dockerrun-it-p8888:80172.20.23.31/server1/nginx-base:v1nginx
只能是双引号!
CMD["param1","param2"]
--此种用法用于为ENTRYPOINT指令提供默认参数
可用于执行脚本:
添加脚本:
ADDrun_tomcat.sh/apps/tomcat/bin/run_tomcat.sh
RUNchmod+x/apps/tomcat/bin/run_tomcat.sh
RUNchown-Rtomcat:tomcat/apps/data/tomcat
CMD["/apps/tomcat/bin/run_tomcat.sh"]--引用脚本!
..............................................................
11ENTRYPOINT
类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独
的可执行程序
与CND不同的是,由这个指令启动的程序不会被dockerrun命令行指定的参数所覆盖
而且,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序
使用格式:
ENTRYPOINT
ENTRYPOINT[""," "," "]
dockerrun命令传入的命令参数会覆盖CMD指定的内容并且附加到ENTRYPOINT
命令最后作为其参数使用
Dockerfile文件中也可以存在多个此指令,但仅有最后一个生效!
在dockerrun时,使用--entrypointstring选项传递的命令可以覆盖Dockerfile中
定义的ENTRYPOINT指令
如何让Nginx配置文件接收参数
创建一个脚本:
#!/bin/bash
#
cat>/etc/nginx/conf.d/www.conf<server{
server_name${HOSTNAME};
listen${IP:-0.0.0.0}:${PORT:-80};
root${ROOT:-/web/html};
}
EOF
exec"$@"
chmod+xnginx-conf.sh
Dockerfile文件:
FROMxxx
ENVROOT='/web/html/'
ADDindex.html${ROOT}
ADDnginx-conf.sh/bin/nginx-conf.sh
CMD["/usr/sbin/nginx","-g","daemonoff;"]
ENTRYPOINT["/bin/nginx-conf.sh"]
dockerrun--nameb1--rm-P-e"PORT=8080"[镜像ID]
注意:必须使用双引号!!!
................................................................................
12USER命令:
用于指定运行image时的或运行Dockerfile中的任何RUN,CMD或ENTRYPOINT
指令指定的程序时的用户名或UID
默认情况下,container的运行身份为root
格式:
USER
需要注意的是
UID否则dockerrun命令将运行失败!
必须要在容器中的/etc/passwd文件中个存在
....................................................................
13HEALTHCHECK
健康状态监测
HEALTHCHECKNONE--不要做监测
常用选项:
--interval=DURATION默认30秒--多长时间监测一次
--timeout=DURATION默认30秒--监测超时时间
--start-period=DURATION--当docker容器启动后,延迟多长时间才健康检查
默认0秒
--retries=N默认3次
默认检查多少次在认为失败
响应值:
0--成功
1--失败
2--自定义
应用示例:
HEALTHCHECK--interval=5m--timeout=3sCMDcurl-fhttp://localhost/||exit1
Dockerfile中应用:
HEALTHCHECK--start-period=3sCMDwget-O--qhttp://{IP:-0.0.0.0}:${PORT:-80}/
也可以在dockerrun中定义:
--health-cmdstring
--health-intervalduration
--health-retriesint
--health-start-periodduration
--health-timeoutduration
.................................................................
14SHELL指令:
["cmd","/S","/C"]--windons
...........................................................
15STOPSIGNAL命令:
STOPSIGNAL信号名称
定义停止命令的信号!
SIGKILL--9信号
.............................................................
16ARG参数:
用于dockerbuild的过程中使用
可以被--buil-arg当做参数传递过来!
具体应用:
ARGauther=tim
LABLEmaintainer=${auther}
dockerbuild--build-argauther=tom-txxx./
在dockerfile中存在的arg变量,如果在dockerbuild时也
设置了--build-arg变量,这样最终以命令行界面的变量值为
最终值!
.................................................................
17ONBUILD
用于在dockerfile中定义一个触发器
dockerfile用于build映像文件,此映像文件亦可作为baseimage被另一个
dockerfile用作from指定的参数,并以之构建新的影响文件
在后面的这个dockerfile中的from指定在build过程中被执行时,将会触发
创建其baseimage的dockerfile文件的ONBUILD指定定义的触发器
格式:
ONBUILD要执行的Dockerfile指令
尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套
且不会触发from和maintainer指令
使用包含onbuild指定的dockerfile构建的镜像应该使用特殊的标签
例如ruby:2.0-onbuild
在onbuild指令中使用add或copy指令硬格外小心,因为构建过程的上下文
在缺少指定的源文件时会失败!
会在别人引用这个镜像时执行!并不会在首次build过程执行