当前位置: 移动技术网 > 网络运营>服务器>虚拟主机 > Dockerfile中常用命令汇总

Dockerfile中常用命令汇总

2019年04月17日  | 移动技术网网络运营  | 我要评论

语法组成:

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 <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 ${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 ${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 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过程执行

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网