‘DockerFile(二)

Dockerfile包含了构建Docker镜像的各种指令,如FROM指定基础镜像,RUN执行命令,CMD设置容器启动命令,LABEL添加元数据,EXPOSE暴露端口,ENV设置环境变量,ADD和COPY复制文件,ENTRYPOINT设置默认启动命令,VOLUME定义数据卷,USER设置运行用户,WORKDIR设定工作目录,ARG定义构建变量,ONBUILD定义后续构建动作,STOPSIGNAL设置停止信号,以及HEALTHCHECK用于健康检查。
摘要由CSDN通过智能技术生成

目录

🍎Dockerfile命令

🍉FROM

🍉RUN

🍉CMD

🍉LABEL

🍉MAINTAINER

🍉EXPOSE

🍉ENV

🍉ADD

🍉COPY

🍉ENTRYPOINT

🍉VLOUME

🍉USER

🍉WORKDIR

🍉ARG

🍉ONBUILD

🍉STOPSIGNAL

🍉HEALTHCHECK


Dockerfile命令

FROM指定基础镜像
RUN在镜像中执行命令
CMD指定容器启动时要执行的命令
LABEL为Docker镜像添加元数据
MAINTAINER用于指定镜像的创建者和联系人信息
EXPOSE暴露端口
ENV设置环境变量
ADD类似于COPY,但是还支持解压缩和远程文件下载等功能
COPY将文件从主机复制到镜像中
ENTRYPOINT用于为容器指定启动时默认执行的命令或程序
VLOUME声明容器将要挂载的数据卷
USER用于设置Docker容器运行时的用户或用户组
WORKDIR设置工作目录
ARG用于定义构建时候的变量
ONBUILD用于定义镜像的下一级构建动作
STOPSIGNAL用于设置容器停止时捕获的信号
HEALTHCHECK用于设置容器的健康检查
FROM

它的功能是指定基础的镜像,并且必须是第一条的指令,如果不以任何镜像为基础,那么写法为:FROM scratch。同时以为这接下来所写的指令将作为镜像的第一层开始

[root@localhost ~]# cat Dockerfile 
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>

三种写法,其中tag和digest是可选项,如果没有选择,那么默认值为latest

RUN

在构建镜像时所要执行的命令

[root@localhost ~]# cat Dockerfile 
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行符是\

CMD

功能是为容器启动时要运行的命令,而且整个dockerfile文件里只能有一个cmd命令

[root@localhost ~]# cat Dockerfile
CMD [ "sh", "-c", "echo $HOME" ]
CMD [ "echo", "$HOME" ]

RUN&CMD

RUN:是在构建这个镜像的时候所执行的命令

CMD:是在容器启动的时候执行的命令

LABEL

功能是为镜像指定标签

[root@localhost ~]# cat Dockerfile 
LABEL <test>=<1> 
LABEL <test>=<2> 
LABEL <test>=<3>

当我们在定义标签的时候并不建议这样写多行,尽量写成一行,使用\符号来进行换行

[root@localhost ~]# cat Dockerfile 
LABEL <test>=<1> \
<test>=<2> \
<test>=<3>
MAINTAINER

就是指定作者 语法:MAINTAINER

EXPOSE

功能是把运行的容器的端口暴露给外部,但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数

[root@localhost ~]# cat Dockerfile 
FROM centos:7
RUN yum -y install vim
EXPOSE "80":"80"
ENV

功能就是设置环境变量,这个变量在我们启动容器的时候还会有的变量

[root@localhost ~]# cat Dockerfile
ENV a="123"
ADD

一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用

可以是一个本地文件或者是一个本地压缩文件,还可以是一个url 如果把写成一个url,那么ADD就类似于wget命令

[root@localhost ~]# cat Dockerfile 
ADD test.txt /usr/src/  
ADD http://example.com/foobar / ##这个是把这个链接的包下载好放到镜像里
ADD nginx.tar.gz /      ##这个可以把nginx的tar包自动解压在放到镜像里

当我们在ADD的时候源文件或者目录需要跟dockerfile文件放在一起,ADD在复制的时候找的源文件位置的当前的目录下,而目标位置则需要写绝对路径

COPY

COPY和ADD命令相似,但我们在COPY链接的时候COPY会把这个链接当成一个字符串进行复制,而COPYtar包的时候不会自动解压这个tar包

ENTRYPOINT

功能是启动时的默认命令

第二种就是写shell 第一种就是可执行文件加参数 与CMD比较说明(这俩命令太像了,而且还可以配合使用):

  1. 相同点: 只能写一条,如果写了多条,那么只有最后一条生效 容器启动时才运行,运行时机相同

  2. 不同点: ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数

[root@localhost ~]# cat Dockerfile 
FROM centos:7
ENTRYPOINT ls -a
CMD top -b

这样写会执行 top -b,ls -a 不会执行

VLOUME

可实现挂载功能,可以将内地文件夹或者其他容器中的文件夹挂在到这个容器中

[root@localhost ~]# cat Dockerfile 
FROM centos:7
VOLUME /var/log /var/db

一般的使用场景为需要持久化存储数据时 容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。 所以当数据需要持久化时用这个命令

USER

设置启动容器的用户,也可以理解为在我们构建镜像时来回的切换用户,但是切换用户的前提是必须有这个用户

[root@localhost ~]# cat Dockerfile 
FROM centos:7
USER 用户名
USER UID

注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行

WORKDIR

设置工作目录,也就是类似于cd命令来切换目录,当我们设置的这个工作目录不存在的时候会自动创建这个目录

[root@localhost ~]# cat Dockerfile 
FROM centos:7
WORKDIR /a/b/c
WORKDIR /a
ARG

设置变量命令,在docker build构建镜像的时候用到的变量,当我们在启动容器的时候这个ARG变量会消失

[root@localhost ~]# cat Dockerfile 
FROM centos:7
ARG user=test
ONBUILD

语法: ONBUILD [INSTRUCTION] 这个命令只对当前镜像的子镜像生效。

比如当前镜像为A,在Dockerfile种添加:

ONBUILD RUN ls -al 这个 ls -al 命令不会在A镜像构建或启动的时候执行

此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行

STOPSIGNAL

语法: STOPSIGNAL signal STOPSIGNAL命令是的作用是当容器退出时给系统发送什么样的指令

HEALTHCHECK

容器健康状况检查命令 语法有两种:

  1. HEALTHCHECK [OPTIONS] CMD command

  2. HEALTHCHECK NONE 第一个的功能是在容器内部运行一个命令来检查容器的健康状况 第二个的功能是在基础镜像中取消健康检查命令 [OPTIONS]的选项支持以下三中选项:

--interval=DURATION 两次检查默认的时间间隔为30秒

--timeout=DURATION 健康检查命令运行超时时长,默认30秒

--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

注意:HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。 CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:

0: success - 表示容器是健康的

1: unhealthy - 表示容器已经不能工作了

2: reserved - 保留值

[root@localhost ~]# cat Dockerfile 
FROM nginx
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值