纯干货!Docker Dockerfile指令大全(下)

简介: 什么是 Dockerfile?Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。使用docker build命令,用户可以创建基于基础镜像的自定义镜像。

ARG-设置环境变量

构建参数ARGENV指令一样,都是设置环境变量。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。即在将来容器运行时是不会存在这些环境变量的。但是不要因此就用ARG来保存密码之类的信息,因为通过docker history还是能够看得到的。

ARG构建命令在docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

语法格式如下:

ARG <参数名>[=<默认值>]
复制代码


示例:

FROM ubuntu:16.04
ARG app="python-pip"
RUN apt-get update && apt-get install -y $app && rm -rf /var/lib/apt/lists/*
# 我们可以定义多个参数
FROM busybox
ARG user1
ARG buildno
# 也可以给参数一个默认值
FROM busybox
ARG user1=someuser
ARG buildno=1
# 如果我们给ARG定义了参数默认值,那么当build镜像时,如果没有指定参数值,将会使用这个默认值。
复制代码


WORKDIR-指定工作目录

用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,它的路径是相对此前一个WORKDIR指令指定的路径。另外,WORKDIR也可调用由ENV指定定义的变量。

格式:

WORKDIR <工作目录路径>
复制代码


样例:

WORKDIR /var/log 
# 解析环境变量
ENV DIRPATH /path
WORKDIR $DIRPATH
# 也可以设置多次
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# pwd执行的结果是/a/b/c
复制代码


VOLUME-定义匿名数据卷

定义匿名数据卷,可实现挂载功能,可以将内地文件夹或者其他容器中得文件夹挂在到这个容器中。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。(容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。)
  • 避免容器不断变大。

语法格式如下:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
复制代码


在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

样例:

# 定义一个匿名卷
FROM ubuntu:16.04
VOLUME /data
# 定义多个匿名卷
FROM ubuntu:16.04
VOLUME ["/data", "/command"]
复制代码


这里的/data/command目录在容器运行时会自动挂载为匿名卷,任何向/data/command目录中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化!容器匿名卷目录指定可以通过docker run命令中指定-v参数来进行覆盖。

USER-指定执行后续命令的用户和用户组

用于指定执行后续命令的用户和用户组,这里只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。在USER命令之前可以使用RUN命令创建需要的用户。

默认情况下,容器的运行身份为root用户。

语法格式如下:

# 可以指定用户名或者UID,组名或者GID
USER <user>[:<group>]
USER <UID>[:<GID>]
复制代码


USER指令还可以在docker run命令中使用-u参数进行覆盖。

样例:

RUN groupadd -r docker && useradd -r -g docker docker
USER docker
复制代码


ONBUILD-用于延迟构建命令的执行

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

ONBUILD是一个特殊的指令,它后面跟着的是其他指令,比如COPYRUN等,而这些命令在当前镜像被构建时,并不会被执行。只有以当前镜像为基础镜像去构建下一级镜像时,才会被执行。

Dockerfile中的其他指令都是为了构建当前镜像准备的,只有ONBUILD指令是为了帮助别人定制而准备的。

语法格式如下:

ONBUILD <其他指令>
复制代码


样例:

from ubuntu:16.04
WORKDIR /data
ONBUILD RUN mkdir test
复制代码


STOPSIGNAL

设置将发送到容器以退出的系统调用信号。这个信号可以是一个有效的无符号数字,与内核的syscall表中的位置相匹配,如9,或者是SIGNAME格式的信号名,如SIGKILL

语法格式如下:

STOPSIGNAL signal
复制代码


默认的停止信号是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出。如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s。


HEALTHCHECK-容器健康状况检查

用于指定某个程序或者指令来监控 docker 容器服务的运行状态是否正常。

语法格式如下:

# 设置检查容器健康状况的命令
HEALTHCHECK [OPTIONS] CMD <命令>
# 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK NONE
复制代码


OPTIONS参数说明:

  • –interval=<间隔> :两次检查的时间间隔,默认为30s
  • –timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查将会判定为失败,默认为30s
  • –retries=<次数> :当连续失败指定次数之后,则将容器状态视为unhealthy,默认为3次。
  • --start-period=DURATION:启动时间,默认为0s, 如果指定这个参数, 则必须大于 0s ;--start-period 为需要启动的容器提供了初始化的时间段, 在这个时间段内如果检查失败, 则不会记录失败次数。 如果在启动时间内成功执行了健康检查, 则容器将被视为已经启动, 如果在启动时间内再次出现检查失败, 则会记录失败次数。

CMD 关键字之后的 command 可以是一个 shell 命令(例如: HEALTHCHECK CMD /bin/check-running)或者一个 exec 数组(与其它 Dockerfile 命令相同, 参考 [ENTRYPOINT])。

该命令的返回值说明了容器的状态, 可能是值为:

  • 0: healthy - 容器健康,可以使用;
  • 1: unhealthy - 容器工作不正常,需要诊断;
  • 2: reserved - 保留,不要使用这个返回值;

当容器的健康状态发生变化时,会生成一个带有新状态的 health_status 事件。

样例:

HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1
复制代码


注意:

CMDNETRYPOINT一样,HEALTHCHECK指令只可以出现一次,如果有多个HEALTHCHECK指令,那么只有最后一个才会生效!


SHELL-重写xxx指令的shell格式所使用的默认shell

SHELL指令允许重写xxx指令的shell格式所使用的默认shell。关于默认的shellLinux["/bin/sh", "-c"]Windows["cmd", "/S", "/C"]

SHELL 指令必须在dockerfile中以JSON格式编写。

SHELL 指令在 Windows 上特别有用,Windows 有两种常用且截然不同的本机 shell:cmdpowershell,以及可用的备用 shell,包括 sh

SHELL 指令可以出现多次。 每条 SHELL 指令都会覆盖所有先前的 SHELL 指令,并影响所有后续指令。

样例:

FROM microsoft/windowsservercore
# Executed as cmd /S /C echo default
RUN echo default
# Executed as cmd /S /C powershell -command Write-Host default
RUN powershell -command Write-Host default
# Executed as powershell -command Write-Host hello
SHELL ["powershell", "-command"]
RUN Write-Host hello
# Executed as cmd /S /C echo hello
SHELL ["cmd", "/S", "/C"]
RUN echo hello
复制代码


当在 Dockerfile 中使用它们的 shell 格式时,以下指令可能会受到 SHELL 指令的影响:RUNCMDENTRYPOINT

参考文章

相关文章
|
3天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
123 75
|
1月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
783 12
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
25天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
48 9
|
1月前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
106 3
|
2月前
|
Docker 容器
docker中使用Dockerfile自动创建数据卷
【10月更文挑战第12天】
33 5
|
2月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
72 4
|
3月前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
566 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
3月前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
171 20
|
3月前
|
Docker 容器
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
|
4月前
|
Docker 容器
在Docker中,Dockerfile有哪些常见指令?
在Docker中,Dockerfile有哪些常见指令?

热门文章

最新文章