领取MOLI红包

Dockerfile中常用命令汇总

语法组成:1 注释信息2 指令---参数 [通常要大写|实质上不区分大小写]3 顺序执行4 第一个非注释行必须是from [基于那个基础镜像制作] 5 需要一个专用目录[自己创建]6 首字目必须大写---Dockerfile7 制作镜像依赖到文件或者包组时,必须提前准备至专用目录下.dockerignore file --每一行中定义一个忽略文件 --创建在工作目录中 例如:pam.d/su*......................................................


语法组成: 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 <[email protected]>" ....................................................... 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 <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.d/www.conf <<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--自定义 应用示例: HEALTHCHECK --interval=5m --timeout=3s CMD curl -f

相关资讯