Dockerfile中常用命令汇总

本站所有内容来自互联网收集,仅供学习和交流,请勿用于商业用途。如有侵权、不妥之处,请第一时间联系我们删除!Q群:迪思分享

免费资源网 – https://freexyz.cn/

语法组成:

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.com>”

……………………………………………….

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.2.tar.gz /usr/local/src/ –不受影响

WORKDIR /usr/local/src/

ADD nginx-1.14.2.tar.gz ./ –受影响

…………………………………………………….

6 VOLUME –卷

只能定义docker管理的卷:

VOLUME /data/mysql

运行的时候会随机在宿主机的目录下生成一个卷目录!

……………………………………………………….

7 EXPOSE 为容器打开指定要监听的端口以实现与外部通信

使用格式:

EXPOSE 80/tcp 23/udp

不加协议默认为tcp

使用-P选项可以暴露这里指定的端口!

但是宿主的关联至这个端口的端口是随机的!

……………………………………………………..

8 ENV

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于

其后的其它命令所调用

调用格式:

$A 或 ${A}

ENV

ENV <key>=<value>

第一种格式中,key之后的所有内容均会被其视作的组成部分

因此,一次只能设置一个变量!

第二种格式可用一次设置多个变量,每个变量为一个=

的键值对,如果中包含空格,可以反斜线()进行转义

也可以通过对<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

RUN [“<executable>”,”<param1>”,”<param2>”]

第一种格式中 来运行它

这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使用docker stop命令

来停止容器时,此进程接收不到信号

第二种语法格式中的参数是一个JSON格式的数组,其中为要运行的命令,后面的

为传递给命令的选项或参数,然而,此种格式指定的命令不会以”/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

ENTRYPOINT [“<executable>”,”<param1>”,”<param2>”]

docker run 命令传入的命令参数会覆盖CMD指定的内容并且附加到ENTRYPOINT

命令最后作为其参数使用

Dockerfile文件中也可以存在多个此指令,但仅有最后一个生效!

在docker run时,使用–entrypoint string选项传递的命令 可以覆盖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 +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>

需要注意的是可以为任意数字,但实践中其必须为/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–自定义

应用示例:

HEALTHCHECK –interval=5m –timeout=3s CMD curl -f http://localhost/ || exit1

Dockerfile中应用:

HEALTHCHECK –start-period=3s CMD wget -O – -q http://{IP:-0.0.0.0}:${PORT:-80}/

也可以在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 ONBUILD

用于在dockerfile中定义一个触发器

dockerfile用于build映像文件,此映像文件亦可作为base image被另一个

dockerfile用作from指定的参数,并以之构建新的影响文件

在后面的这个dockerfile中的from指定在build过程中被执行时,将会触发

创建其base image的dockerfile文件的ONBUILD指定定义的触发器

格式:

ONBUILD 要执行的Dockerfile指令

尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套

且不会触发from和maintainer指令

使用包含onbuild指定的dockerfile构建的镜像应该使用特殊的标签

例如ruby:2.0-onbuild

在onbuild指令中使用add或copy指令硬格外小心,因为构建过程的上下文

在缺少指定的源文件时会失败!

会在别人引用这个镜像时执行!并不会在首次build过程执行

免费资源网 – https://freexyz.cn/


© 版权声明
THE END
★喜欢这篇文章吗?喜欢的话,麻烦动动手指支持一下!★
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容