Dockerfile中常⽤命令汇总语法组成:
1 注释信息
2 指令---参数 [通常要⼤写|实质上不区分⼤⼩写]
3 顺序执⾏
4 第⼀个⾮注释⾏必须是from [基于那个基础镜像制作]
5 需要⼀个专⽤⽬录[⾃⼰创建]
6 ⾸字⽬必须⼤写---Dockerfile
7 制作镜像依赖到⽂件或者包组时,必须提前准备⾄专⽤⽬录下
.dockerignore file --每⼀⾏中定义⼀个忽略⽂件
--创建在⼯作⽬录中
例如:pam.d/su* .........................................................
dockerfile中的常⽤指令:
1 FROM ---指定基础镜像
基础镜像不存在会在Docker Hub上拉去
使⽤格式:
FROM <;镜像>:[tag]
FROM <;镜像>@digest[校验码]
当前主机没有此镜像时,会⾃动去官⽹HUB下载..............................................
2 MAINTANIER --提供Dockerfile 制作者提供本⼈信息
[逐渐废弃]
LABLE --替代MAINTANIER
具体使⽤:
LABLE maintainer="作者信息"
使⽤格式:
MAINTANIER "guowei <597599150@qq>" .......................................................
3 COPY --把宿主机中的⽂件复制到镜像中去!
⽂件要在Dockerfile⼯作⽬录
src 原⽂件
--⽀持通配符
--通常相对路径
dest ⽬标路径
--通常绝对路径
有空⽩字符隔开的字串需要⽤"",否则会被当做两个⽂件!
⽂件复制准则:
1 src必须是build上下⽂中的路径,不能是其⽗⽬录
2 如果src是⽬录,则其内部⽂件或⼦⽬录会被递归复制
但src⽬录⾃⾝不会被复制
3 如果指定了多个src,或在src中使⽤了通配符,则dest必须是⼀个
⽬录,且必须以/结尾
4 如果dest实现不存在,它将会被⾃动创建,这包括其⽗⽬录..............................................................
4 ADD --类似COPY命令
⽀持URL路径----如果可以访问⽹络的话,会访问⽹络下载
到本地然后打包进镜像!
操作准则:
1 如果src为URL且dest不以/结尾,则src指定的⽂件将被下载并
直接被创建为dest;如果dest以/结尾,则⽂件名URL指定的⽂件
将被直接下载并保存为dest/filename
2 如果是压缩包会被解压,但通过URL路径获取到的tar⽂件不会被展开
3 如果src有多个,或其间接或直接使⽤了通配符,则dest必须是⼀个以/结尾的⽬录路径,如果dest不以/结尾,则其被视为⼀个普通⽂件src的内容将被直接写⼊到dest中!
...............................................................
5 WORKDIR --指定⼯作⽬录
每次只会影响这个指令后续的指令
ADD nginx-1.14. /usr/local/src/ --不受影响
WORKDIR /usr/local/src/
ADD nginx-1.14. ./ --受影响
.............................................................
6 VOLUME --卷
只能定义docker管理的卷:
VOLUME /data/mysql
运⾏的时候会随机在宿主机的⽬录下⽣成⼀个卷⽬录!................................................................
7 EXPOSE 为容器打开指定要监听的端⼝以实现与外部通信
使⽤格式:
EXPOSE 80/tcp 23/udp
不加协议默认为tcp
使⽤-P选项可以暴露这⾥指定的端⼝!
但是宿主的关联⾄这个端⼝的端⼝是随机的!..............................................................
8 ENV
⽤于为镜像定义所需的环境变量,并可被Dockerfile⽂件中位于
其后的其它命令所调⽤
调⽤格式:
$A 或 ${A}
ENV <key> <value>
ENV <key>=<value>
第⼀种格式中,key之后的所有内容均会被其视作<value>的组成部分因此,⼀次只能设置⼀个变量!
第⼆种格式可⽤⼀次设置多个变量,每个变量为⼀个<key>=<value>
的键值对,如果<value>中包含空格,可以反斜线(\)进⾏转义
也可以通过对<value>加引号进⾏标识。另外,反斜线也可⽤于续航
定义多个变量时。建议使⽤第⼆种⽅式,以便在同⼀层中完成所有功能具体⽤法:
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/
ENV A /web/html
COPY index.html ${A:-/web/html}
在docker run 中传递变量:
docker run -e [list] 传变量值
如果在dockerfile中赋值变量后也能在docker run中继续赋值
docker run --name b1 --rm -e A=xx [镜像ID]
不会影响docker build 的过程!
printenv --输出环境变量信息..............................................................
9 RUN命令:
使⽤格式:
RUN <command>
RUN ["<executable>","<param1>","<param2>"]
第⼀种格式中 <command命令通常是⼀个shell命令且以"/bin/sh -c">来运⾏它
这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使⽤docker stop命令
来停⽌容器时,此进程接收不到信号
第⼆种语法格式中的参数是⼀个JSON格式的数组,其中<executable>为要运⾏的命令,后⾯的<paramN>为传递给命令的选项或参数,然⽽,此种格式指定的命令不会以"/bin/sh -c">来运⾏它因此常见的shell操作如变量替换以及通配符替换将不会进⾏不过如果要运⾏的命令依赖于
此shell特性的话,可以将其替换为下⾯的格式:
RUN ["/bin/bash","-c","<executable>","<param1>"] ........................................................................
10 CMD命令:运⾏于docker run中
语法有三种写法
1. CMD ["executable","param1","param2"] --启动为ID为1的进程
具体实例:
CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html]
2. CMD ["param1","param2"]
3. CMD command param1 param2 --直接运营为shell的⼦进程
param*=执⾏参数
例如第⼆种:
CMD ["nginx"]
docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx
只能是双引号!
CMD ["param1","param2"]
--此种⽤法⽤于为ENTRYPOINT指令提供默认参数
可⽤于执⾏脚本:
添加脚本:
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
RUN chmod +x /apps/tomcat/bin/run_tomcat.sh
RUN chown -R tomcat:tomcat /apps /data/tomcat
CMD ["/apps/tomcat/bin/run_tomcat.sh"] -- 引⽤脚本!
11 ENTRYPOINT
类似CMD指令的功能,⽤于为容器指定默认运⾏程序,从⽽使得容器像是⼀个单独的可执⾏程序
与CND不同的是,由这个指令启动的程序不会被docker run 命令⾏指定的参数所覆盖⽽且,这些命令⾏参数会被当做参数传递给ENTRYPOINT指定的程序
使⽤格式:
ENTRYPOINT <command>
ENTRYPOINT ["<executable>","<param1>","<param2>"]
docker run 命令传⼊的命令参数会覆盖CMD指定的内容并且附加到ENTRYPOINT
命令最后作为其参数使⽤
Dockerfile⽂件中也可以存在多个此指令,但仅有最后⼀个⽣效!
在docker run时,使⽤--entrypoint string选项传递的命令可以覆盖Dockerfile中
定义的ENTRYPOINT指令
如何让Nginx配置⽂件接收参数
创建⼀个脚本:
#!/bin/bash
#
cat > /etc/nginx/conf.f <<EOF
server {
server_name ${HOSTNAME};
listen ${IP:-0.0.0.0}:${PORT:-80};
root ${ROOT:-/web/html};
}
EOF
exec "$@"
chmod +x nginx-conf.sh
Dockerfile⽂件:
FROM xxx
ENV ROOT='/web/html/'
ADD index.html ${ROOT}
ADD nginx-conf.sh /bin/nginx-conf.sh
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/nginx-conf.sh"]
docker run --name b1 --rm -P -e "PORT=8080" [镜像ID]
注意:必须使⽤双引号................................................................................
12 USER命令:
⽤于指定运⾏image时的或运⾏Dockerfile中的任何RUN,CMD或ENTRYPOINT
指令指定的程序时的⽤户名或UID
默认情况下,container的运⾏⾝份为root
格式:
USER <UID>|<UserName>
需要注意的是<UID>可以为任意数字,但实践中其必须为/etc/passwd中某⽤户的有效UID否则docker run命令将运⾏失败!
必须要在容器中的/etc/passwd⽂件中个存在
13 HEALTHCHECK
健康状态监测
HEALTHCHECK NONE --不要做监测
常⽤选项:
--interval=DURATION 默认30秒 --多长时间监测⼀次
--timeout=DURATION 默认30秒 --监测超时时间
--start-period=DURATION --当docker容器启动后,延迟多长时间才健康检查默认0秒
--retries=N 默认3次
默认检查多少次在认为失败
响应值:
0--成功
1--失败
2--⾃定义
应⽤⽰例:
Dockerfile中应⽤:
也可以在docker run中定义:
--health-cmd string
--health-interval duration
--health-retries int
--health-start-period duration
--health-timeout duration .................................................................
14 SHELL指令:
["cmd","/S","/C"] --windons ...........................................................
15 STOPSIGNAL命令:
STOPSIGNAL 信号名称
定义停⽌命令的信号!
SIGKILL --9信号.............................................................
16 ARG参数:
⽤于docker build 的过程中使⽤
可以被--buil-arg当做参数传递过来!
具体应⽤:
ARG auther=tim
LABLE maintainer=${auther}
docker build --build-arg auther=tom -t xxx ./
在dockerfile中存在的arg变量,如果在docker build 时也
设置了--build-arg变量,这样最终以命令⾏界⾯的变量值为
最终值!.................................................................
17 ONBUILDnginx停止命令
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论