dockerfile映射log⽂件⽬录_Dockerfile命令详解FROM
功能为指定基础镜像,并且必须是第⼀条指令。curl是什么命令
如果不以任何镜像为基础,那么写法为:FROM scratch。
同时意味着接下来所写的指令将作为镜像的第⼀层开始
语法:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest
RUN
功能为运⾏指定的命令
RUN命令有两种格式
1. RUN <command>
2. RUN ["executable", "param1", "param2"]
第⼀种后边直接跟shell命令
在linux操作系统上默认 /bin/sh -c
在windows操作系统上默认 cmd /S /C
第⼆种是类似于函数调⽤。
可将executable理解成为可执⾏⽂件,后⾯就是两个参数。
两种写法⽐对:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多⾏命令不要写多个RUN,原因是Dockerfile中每⼀个指令都会建⽴⼀层.
多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
RUN书写时的换⾏符是
CMD
功能为容器启动时要运⾏的命令
语法有三种写法
1. CMD ["executable","param1","param2"]
2. CMD ["param1","param2"]
3. CMD command param1 param2
第三种⽐较好理解了,就时shell这种执⾏⽅式和写法
第⼀种和第⼆种其实都是可执⾏⽂件加上参数的形式
举例说明两种写法:
CMD [ "sh", "-c", "echo $HOME"
CMD [ "echo", "$HOME" ]
补充细节:这⾥边包括参数的⼀定要⽤双引号,就是",不能是单引号。千万不能写成单引号。
原因是参数传递后,docker解析的是⼀个JSON array
RUN & CMD
不要把RUN和CMD搞混了。
RUN是构件容器时就运⾏的命令以及提交运⾏结果
CMD是容器启动时执⾏的命令,在构件时并不运⾏,构件时紧紧指定了这个命令到底是个什么样⼦LABEL
功能是为镜像指定标签
语法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
⼀个Dockerfile种可以有多个LABEL,如下:
LABEL "ample.vendor"="ACME Incorporated"
ample.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates
that label-values can span multiple lines."
但是并不建议这样写,最好就写成⼀⾏,如太长需要换⾏的话则使⽤符号
如下:
LABEL multi.label1="value1"
multi.label2="value2"
other="value3"
说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
MAINTAINER
指定作者
语法:
MAINTAINER <name>
EXPOSE
功能为暴漏容器运⾏时的监听端⼝给外部
但是EXPOSE并不会使容器访问主机的端⼝
如果想使得容器与主机的端⼝有映射关系,必须在容器启动的时候加上 -P参数
ENV
功能为设置环境变量
语法有两种
1. ENV <key> <value>
2. ENV <key>=<value> ...
两者的区别就是第⼀种是⼀次设置⼀个,第⼆种是⼀次设置多个
ADD
⼀个复制命令,把⽂件复制到景象中。
如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加⽤户名和密码的权限验证,⽽ADD不⽤。语法如下:
1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"]
<dest>路径的填写可以是容器内的绝对路径,也可以是相对于⼯作⽬录的相对路径
<src>可以是⼀个本地⽂件或者是⼀个本地压缩⽂件,还可以是⼀个url
如果把<src>写成⼀个url,那么ADD就类似于wget命令
如以下写法都是可以的:
ADD test relativeDir/
ADD test /relativeDir
ADD example/foobar /
尽量不要把<scr>写成⼀个⽂件夹,如果<src>是⼀个⽂件夹了,复制整个⽬录的内容,包括⽂件系统元数据
COPY
看这个名字就知道,⼜是⼀个复制命令
语法如下:
1. COPY <src>... <dest>
2. COPY ["<src>",... "<dest>"]
与ADD的区别
COPY的<src>只能是本地⽂件,其他⽤法⼀致
ENTRYPOINT
功能是启动时的默认命令
语法如下:
1. ENTRYPOINT ["executable", "param1", "param2"]
2. ENTRYPOINT command param1 param2
如果从上到下看到这⾥的话,那么你应该对这两种语法很熟悉啦。
第⼆种就是写shell
第⼀种就是可执⾏⽂件加参数
与CMD⽐较说明(这俩命令太像了,⽽且还可以配合使⽤):
1. 相同点:
只能写⼀条,如果写了多条,那么只有最后⼀条⽣效
容器启动时才运⾏,运⾏时机相同
2. 不同点:
ENTRYPOINT不会被运⾏的command覆盖,⽽CMD则会被覆盖
如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是⼀个完整的可执⾏命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
如下:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是⼀个完整的指令,那么它们两个会互相覆盖,谁在最后谁⽣效
如下:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ls -al
那么将执⾏ls -al ,top -b不会执⾏。
Docker官⽅使⽤⼀张表格来展⽰了ENTRYPOINT 和CMD不同组合的执⾏情况
(下⽅表格来⾃docker官⽹)
VOLUME
可实现挂载功能,可以将内地⽂件夹或者其他容器种得⽂件夹挂在到这个容器种
语法为:
VOLUME ["/data"]
说明:
["/data"]可以是⼀个JsonArray ,也可以是多个值。所以如下⼏种写法都是正确的
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db
⼀般的使⽤场景为需要持久化存储数据时
容器使⽤的是AUFS,这种⽂件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。
所以当数据需要持久化时⽤这个命令。
USER
设置启动容器的⽤户,可以是⽤户名或UID,所以,只有下⾯的两种写法是正确的
USER daemo
USER UID
注意:如果设置了容器以daemon⽤户去运⾏,那么RUN, CMD 和 ENTRYPOINT 都会以这个⽤户去运⾏WORKDIR
语法:
WORKDIR /path/to/workdir
设置⼯作⽬录,对RUN,CMD,ENTRYPOINT,COPY,ADD⽣效。如果不存在则会创建,也可以设置多次。如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
pwd执⾏的结果是/a/b/c
WORKDIR也可以解析环境变量
如:
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
pwd的执⾏结果是/path/$DIRNAME
ARG
语法:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论