Dockerfile指令参考

news2024/11/15 15:46:46

写在前面

这里是原文链接,本文学习Dockerfile中的指令。

指令表格

指令描述
ADD添加本地文件或远程文件到image
ARG环境变量
CMD运行container时执行的命令
COPY复制文件或目录到image
ENTRYPOINT运行container时执行的命令(优先级高)
ENV环境变量(优先级高)
EXPOSE暴露容器的端口
FROM指定基础image
HEALTHCHECK检查容器
LABEL给image添加元数据
MAINTAINER指定image的作者
ONBUILD构建时指定的指令
RUN运行
SHELL更换默认SHELL
STOPSIGNAL退出容器时指定的系统调用信号
USER设置user和group ID
VOLUME创建或指定volume
WORKDIR设置工作目录

使用说明

使用形式如下,注释用#INSTRUCTION是指令名如ADDFROMarguments是指令携带的参数。

# Comment
INSTRUCTION arguments

指令是不分大小写的,如FROM, from都是合法的,但使用全大写的容易区分指令和参数。docker是逐条运行Dockerfile中的指令的。Dockerfile需要从FROM作为第一条指令。

指令开头前的空格会默认省略,如下两个例子的效果是相同的。

        # this is a comment-line
    RUN echo hello
RUN echo world
# this is a comment-line
RUN echo hello
RUN echo world

但是指令后面的参数中的空格并不会省略,如下面的例子

RUN echo "\
     hello\
     world"

Parser directives

Parser directives(解析器指令)是可选的,下称PD。PD是可选的,不会参与构建,PD的语法类似特殊的注释# directive=value.下面操作将会导致PD失效:

  1. PD使用换行符

    # direc \
    tive=value
    
  2. 声明多次

    # directive=value1
    # directive=value2
    
    FROM ImageName
    
  3. 没有在首行

    FROM ImageName
    # directive=value
    
  4. 在注释后面出现

    # About my dockerfile
    # directive=value
    FROM ImageName
    
  5. 未知的指令将会当作注释

    # unknowndirective=value
    # syntax=value
    

下面是PD支持的指令,分别是syntaxescape

syntax

这个指令的作用是规范编写Dockerfile,类似于xml的语法约束。语法如下:

# syntax=[remote image reference]

使用例子

# syntax=docker/dockerfile:1
# syntax=docker.io/docker/dockerfile:1
# syntax=example.com/user/repo:tag@sha256:abcdef...

语法约束有官方和自定义两种,下面说明官方的方式。
官网约束文件在Docker Hub下的docker/dockerfile仓库,有 stable(稳定)labs(实验) 两种。

stable

stable 有以下三种使用方式。

  1. docker/dockerfile:1持续使用1.x.x的最新版本
  2. docker/dockerfile:1.2 持续使用1.2.x的最新版本,不会使用如1.3.0版本
  3. docker/dockerfile:1.2.1 指定版本,不会更新

labs

labs与stable使用方式相同,不过要加labs后缀

docker/dockerfile:labs
docker/dockerfile:1-labs
docker/dockerfile:1.2-labs 
docker/dockerfile:1.2.1-labs

escape

这个指令是替换默认的换行符,默认的换行符是\。使用方法如下

# escape=`

环境变量替换

使用ENV指令声明的语句,如ENV FOO=/bar,使用类似给/bar起别名’FOO’,在别的指令中使用的方法是${FOO}。下面是一些使用方式,其中第3,4,5和6例子需要在声明# syntax=docker/dockerfile-upstream:master 才可使用

  1. 如果variable存在,variable为结果,否则word为结果

    ${variable:-word} 
    
  2. 如果variable存在,word为结果,否则以空字符串为结果

    ${variable:+word}
    
  3. 从前缀中删除匹配长度最短的字符串,如下面例子删除了foob

    str=foobarbaz echo ${str#f*b}     # arbaz
    
  4. 从前缀中删除匹配长度最长的字符串,如下面例子删除了foobarb

    str=foobarbaz echo ${str##f*b}    # az
    
  5. 从后缀中删除匹配长度最短的字符串,如下面例子删除了baz

    string=foobarbaz echo ${string%b*}    # foobar
    
  6. 从后缀中删除匹配长度最长的字符串,如下面例子删除了brzbaz

    string=foobarbaz echo ${string%%b*}   # foo
    

当需要显示字符原来的意思时,使用\实现。如下例子:

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}   # WORKDIR /bar
ADD . $FOO       # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux

环境变量在以下指令中生效:

  • ADD
  • COPY
  • ENV
  • EXPOSE
  • FROM.
  • LABEL
  • STOPSIGNAL
  • USER
  • VOLUME
  • WORKDIR
  • ONBUILD

事实上,在RUN,CMD,ENTRYPOINT中同样可以使用环境变量,只不过是在command shell使用,而不是builder使用。

变量可以多次声明,后声明的会替换前面声明的。如下面例子中,defhelloghibye

ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

执行命令的两种形式

RUN,CMD,ENTRYPOINT指令都有两种形式。分别是exec形式和shell形式。

INSTRUCTION ["executable","param1","param2"] (exec form)
INSTRUCTION command param1 param2 (shell form)

Exec form

因为exec形式是json数组形式,所以每个元素都必须用双引号括住,而不是单引号。这种形式最好用在ENTRYPOINT指令上,如果用在CMD上,设置的默认参数会在运行时被改变,更多信息在这里

ENTRYPOINT ["/bin/bash", "-c", "echo", "hello"]

变量替换

exec形式并不会进行变量替换,如RUN [ "echo", "$HOME" ]并不会替换$HOME。若需要变量替换,可用以下形式RUN [ "sh", "-c", "echo $HOME" ],这时候是shell在做变量替换而不是builder

Shell form

shell形式总会使用新的command shell,而exec形式不会。使用’'可以将一行的命令分开写成多行。

RUN source $HOME/.bashrc && \
echo $HOME

替换默认的shell

使用SHELL命令可以替换掉默认shell,例如:

SHELL ["/bin/bash", "-c"]
RUN echo hello

FROM

FORM用于指定基础image。FORM可以声明多次,每次声明构建一个image或者作为构建步骤的依赖。
有以下三种使用形式,中括号里都是可选的:

FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

--platform是可选的,用于指定image的目标平台,如linux/amd64, linux/arm64, or windows/amd64AS <name>是给镜像起别名,后面可以用这个别名代表镜像。tagdigest也是可选的,tag指定image的tag版本,digest指定image的版本。

ARG

ARG的效果也是替换字符串,不过是用在指定image的版本上。同时有一点需要注意,ARG替换字符串的效果只能生效在FROM语句使用之后,因为ARG不参与构建。如果想在使用FROM也能发生替换,则需要再次声明,如下所示。

ARG VERSION=latest
FROM busybox:$VERSION
# 再次声明
ARG VERSION
RUN echo $VERSION > image_version

RUN

运行命令的指令,有shell形式和exec形式,上面说过这两种的区别,这里不再赘述。运行的命令都会有缓存,如国想完全重新构建,需要加上--no-cache,如docker build --no-cacheRUN使用例子如下:

RUN apt-get update
RUN apt-get install -y curl

RUN --mount

这个参数可以执行特定的操作,如挂载主机的文件或目录,运行访问安全性高的文件等,共有4种类型,如下所示:

语法形式:--mount=[type=<TYPE>][,option=<value>[,option=<value>]...]

类型描述
bind(默认)挂载主机的目录(只读)
cache此挂载类型允许build container缓存编译器和包管理器的目录。
secret允许访问安全文件如private keys,无须将它们放进image种
ssh允许构建容器通过SSH代理访问SSH密钥,支持口令。

RUN --mount=type=bind

允许绑定文件或目录到build container。默认是只读的。

optiondescription
target挂载路径
source在from里的源路径。默认是from的root
from构建阶段或image的名称。默认为build context。
rw,readwrite挂载后允许写。写入的数据将被丢弃。

RUN --mount=type=cache

此挂载类型允许build container缓存编译器和包管理器的目录。
缓存目录的内容在构建器调用之间持续存在,而不会使指令缓存失效。缓存挂载应该只用于更好的性能。您的构建应该处理缓存目录的任何内容,因为另一个构建可能会覆盖文件,或者如果需要更多的存储空间,GC可能会清除它。

optiondescription
id可选ID,用于识别不同的缓存。默认为target的值。
target挂载路径
ro,readonly设置只读
sharingsharing,private,locked之一。默认为shared。shared cache挂载可以由多个写入器并发使用。设置成private,如果有多个写入器,每个写入创建一个新的挂载。Locked暂停后面的写入器,直到第一个写入器释放挂载。
from构建阶段,用作缓存挂载的基础。默认为空目录。
sourcefrom的子路径。默认为from的根目录。
mode新缓存目录的权限,使用八进制。默认0755
uid新缓存目录的user id。默认0
gid新缓存目录的group id。默认0
例子1,缓存go包
# syntax=docker/dockerfile:1
FROM golang
RUN --mount=type=cache,target=/root/.cache/go-build \
  go build ...
例子2,缓存apt包
# syntax=docker/dockerfile:1
FROM ubuntu
RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
  --mount=type=cache,target=/var/lib/apt,sharing=locked \
  apt update && apt-get --no-install-recommends install -y gcc

Apt需要独占访问其数据,因此缓存使用shared =locked选项,这将确保使用相同缓存挂载的多个并行构建将相互等待,而不会同时访问相同的缓存文件。在这种情况下,如果您希望每个构建都创建另一个缓存目录,也可以使用sharing=private。

RUN --mount=type=tmpfs

这种挂载类型允许在构建容器中挂载tmpfs。

optiondescription
target挂在路径
size指定文件系统大小的上限

RUN --mount=type=secret

这种挂载类型允许构建容器访问安全文件,如私钥,而无需将它们放入映像中。

optiondescription
idsecret的ID。默认为target path的basename
target挂载路径。默认 /run/secrets/ + id
required如果设置为true,则当密钥不可用时,指令将出错。默认为false。
modesecret file的file mode为八进制。默认0400
uid文件的用户ID。默认值0
gid文件的组ID。默认值0
例子 access to S3
# syntax=docker/dockerfile:1
FROM python:3
RUN pip install awscli
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
  aws s3 cp s3://... ...

RUN --mount=type=ssh

这种挂载类型允许构建容器通过SSH代理访问SSH密钥,并支持密码短语。

optiondescription
idssh agent socket或者key的id。默认是"default"
targetssh agent socket路径。默认是/run/buildkit/ssh_agent.${N}.
required如果设置为true,则当密钥不可用时,指令将出错。默认为false。
modesocket的file mode,八进制。默认是0600
uidsocket的用户ID。默认值0
gid文件的组ID。默认值0
使用例子:访问Gitlab
# syntax=docker/dockerfile:1
FROM alpine
RUN apk add --no-cache openssh-client
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh \
  ssh -q -T git@gitlab.com 2>&1 | tee /hello
\ # "Welcome to GitLab, @GITLAB_USERNAME_ASSOCIATED_WITH_SSHKEY" should be printed here
\ # with the type of build progress is defined as `plain`.
eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
docker buildx build --ssh default=$SSH_AUTH_SOCK .

RUN --network

network允许控制命令在哪个网络环境中运行。
语法:--network=<TYPE>

Network类型

typedescription
default(默认)运行在默认网络
none没有网络
host运行在主机的网络环境

RUN --security

在stable语法中还不可以用,需要使用docker/dockerfile:1-labs

RUN --security=insecure

构建器运行不用沙箱运行命令处于不安全模式,这允许运行需要提升权限的流(例如containerd),其作用与docker run --privileged相同

例子 检查权限
# syntax=docker/dockerfile:1-labs
FROM ubuntu
RUN --security=insecure cat /proc/self/status | grep CapEff

RUN --security=sandbox

默认的沙箱模式可以通过——security=sandbox激活,但这是无效的。

CMD

当运行container才会执行的命令,RUN是构建时执行的命令。一个Dockerfile中只能有一个CMD指令。如果您列出了多个CMD命令,则只有最后一个生效。CMD的目的是为执行容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。如果您希望您的容器每次都运行相同的可执行文件,那么您应该考虑将ENTRYPOINT与CMD结合使用。看到入口点。如果用户为docker run指定了参数,那么它们将覆盖CMD中指定的默认值,但仍然使用默认的ENTRYPOINT。如果CMD用于为ENTRYPOINT指令提供默认参数,则CMD和ENTRYPOINT指令都应在exec表单中指定。

LABEL

作用时给image添加元数据。需要注意只能用双引号。使用例子如下

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

为了查看image的label,使用如下命令

docker image inspect --format='{{json .Config.Labels}}' myimage

效果

{
  "com.example.vendor": "ACME Incorporated",
  "com.example.label-with-value": "foo",
  "version": "1.0",
  "description": "This text illustrates that label-values can span multiple lines.",
  "multi.label1": "value1",
  "multi.label2": "value2",
  "other": "value3"
}

EXPOSE

作用是指定容器开放的端口和开放协议(TCP,UDP),默认是TCP。使用形式如下

EXPOSE <port> [<port>/<protocol>...]

例子

EXPOSE 80/tcp
EXPOSE 80/udp

若想启动时定义端口,就在docker run命令加上-p参数,如下

docker run -p 80:80/tcp -p 80:80/udp ...

ENV

作用是设置环境变量。使用形式:

ENV <key>=<value> ...

使用例子

ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy

一个ENV也可以写多个

ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
    MY_CAT=fluffy

这些环境变量会保留到容器运行时,可以使用docker inspect查看环境变量,使用docker run --env <key>=<value>改变环境变量。

ADD

作用是复制新的文件,目录或者远程URL的文件到image的文件系统的dest目录。以下是使用形式:

ADD [--chown=<user>:<group>] [--chmod=<perms>] [--checksum=<checksum>] <src>... <dest>
ADD [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]

--chown--chmod只能用于构建linux containers,并不适用于windows containers
下面是使用例子:

  1. 添加所有以hom开头的文件
    ADD hom* /mydir/
    
  2. ?替换任意字符。如"home.txt"
    ADD hom?.txt /mydir/
    
  3. dest是一个绝对路径,或者WORKDIR的相对路径。如下例子就是将test.txt放到<WORKDIR>/relativeDir/
    ADD test.txt relativeDir/
    
  4. test.txt放到绝对路径/absoluteDir/
    ADD test.txt /absoluteDir/
    

所有新的文件和目录的UIDGID都是0。可以使用--chown改变。当container root filesystem不包含/etc.passwd/etc/group文件,这个ADD操作就会失败。使用数字id不需要查找,也不依赖于容器根文件系统的内容。

ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
ADD --chown=myuser:mygroup --chmod=655 files* /somedir/

src操作需要注意以下要求:

  • src路径必须在build context中,不能使用COPY ../something /something,因为../something访问父目录超出了build context的范围 。
  • 如果src是个目录,这个目录下所有的目录都会被复制
  • 如果src是个URL并且dest/结尾,则文件会放在dest/filename下。如ADD http://example.com/foobar /将会创建文件/foobar
  • 如果src是个本地文本,且是个压缩文件,以gzip,bzip2,xz结尾,则会解压该文件,而远程压缩文件不会这样做。
  • 如果<src>是其他类型的文件,它会连同它的元数据一起单独复制,在这种情况下,如果<dest>以一个斜杠/结尾,它会被认为是一个目录,并且<src>的内容会被写到<dest>/base(<src>)中。
  • 如果直接或使用通配符指定了多个资源,则必须是一个目录,并且必须以斜杠/结尾。
  • 如果<dest>没有以斜杠结尾,它将被认为是一个常规文件,并且<src>的内容将被写在<dest>
  • 如果<dest>不存在,则创建它,以及其路径中所有缺失的目录。

http使用--checksum检查文件是否被修改过

ADD --checksum=sha256:24454f830cdb571e2c4ad15481119c43b3cafd48dd869a9b2945d1036d1dc68d https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz /

添加git仓库

# syntax=docker/dockerfile:1
FROM alpine
ADD --keep-git-dir=true https://github.com/moby/buildkit.git#v0.10.1 /buildkit

添加私有git仓库

# syntax=docker/dockerfile:1
FROM alpine
ADD git@git.example.com:foo/bar.git /bar

构建时的命令使用ssh

docker build --ssh default
# 
buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --ssh default

COPY

作用是复制主机中的文件到容器的中
使用形式:

COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]

使用例子:

COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY test.txt relativeDir/
COPY test.txt /absoluteDir/
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
COPY --chown=myuser:mygroup --chmod=644 files* /somedir/

COPY --link

作用是加速image构建,这里有篇文章说得不错,可以看看。

ENTRYPOINT

  1. Dockeer file应至少有一个CMD或ENTRYPOINT
  2. 当将容器用作可执行文件时,应该定义ENTRYPOINT。
  3. CMD应该用作定义ENTRYPOINT命令的默认参数或在容器中执行临时命令的一种方式。
  4. 当使用可选参数运行容器时,CMD将被覆盖。

以下是CMD和ENTRYPOINT的交互方式
在这里插入图片描述

VOLUME

VOLUME指令创建具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。
使用形式:

VOLUME ["/data"]

使用指令需要以下要求

  1. 使用基于windows的容器时,volume必须是一个不存在的或者空文件夹,且不能位于C盘。
  2. 如果任何构建步骤在声明卷之后更改了卷中的数据,那么这些更改将被丢弃。
  3. 该列表被解析为JSON数组。必须用双引号(")而不是单引号(')括起元素
  4. 主机目录(挂载点)本质上是依赖于主机的。这是为了保持映像的可移植性,因为不能保证给定的主机目录在所有主机上都可用。由于这个原因,您不能从Dockerfile中挂载主机目录。VOLUME指令不支持指定host-dir参数。在创建或运行容器时,必须指定挂载点。

USER

设置当前stage的用户和组,执行CMD时会用到。使用方式:

USER <user>[:<group>]
USER <UID>[:<GID>]
FROM microsoft/windowsservercore
# Create Windows user in the container
RUN net user /add patrick
# Set it for subsequent commands
USER patrick

WORKDIR

设置RUN,CMD,ENTRYPOINT,COPY,ADD的工作目录。合格指令可以设置多次,若提供相对目录,那么是相对当前WORKDIR的目录,如下:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 当前目录是/a/b/c

ARG

作用与ENV相同,不过ENV会覆盖同名的ARG。使用方式:

FROM busybox
USER ${username:-some_user}
ARG username
USER $username
# ...

构建命令docker build --build-arg username=what_user .
第2行的USER计算结果为some_user,因为username变量是在随后的第3行定义的。第4行USER的计算结果为what_user,因为定义了username参数,并且在命令行上传递了what_user值。在ARG指令定义变量之前,对变量的任何使用都会导致一个空字符串。

ARG指令在构建阶段结束时超出了定义它的范围。要在多个阶段中使用一个参数,每个阶段必须包含ARG指令。

FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS

FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS

ENV会覆盖AGR的值,如下:

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=v1.0.0
RUN echo $CONT_IMG_VER

构建命令:docker build --build-arg CONT_IMG_VER=v2.0.1 .
执行构建输出的是v1.0.0

预定义ARG

Docker有一组预定义的ARG变量,你可以在Dockerfile中使用这些变量,而不需要相应的ARG指令。如下:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • FTP_PROXY
  • ftp_proxy
  • NO_PROXY
  • no_proxy
  • ALL_PROXY
  • all_proxy
    使用方式:
 docker build --build-arg HTTPS_PROXY=https://my-proxy.example.com .

ONBUILD

ONBUILD指令将一个触发指令添加到映像中,以便稍后在映像用作另一个构建的基础时执行。触发器将在下游构建的上下文中执行,就像它被插入到下游Dockerfile中的FROM指令之后一样。

任何构建指令都可以注册为触发器。

如果您正在构建一个映像,该映像将用作构建其他映像的基础,例如应用程序构建环境或可以使用特定于用户的配置进行定制的守护进程,那么这将非常有用。

例如,如果您的映像是可重用的Python应用程序构建器,则需要将应用程序源代码添加到特定目录中,并且可能需要在此之后调用构建脚本。您现在不能仅仅调用ADD和RUN,因为您还没有访问应用程序源代码的权限,而且对于每个应用程序构建都是不同的。您可以简单地为应用程序开发人员提供一个样板Dockerfile,以便将其复制粘贴到他们的应用程序中,但这样做效率低下、容易出错且难以更新,因为它与应用程序特定的代码混合在一起。
解决方案是使用ONBUILD注册高级指令,以便在下一个构建阶段运行。

下面是它的工作原理:

  1. 当它遇到ONBUILD指令时,构建器向正在构建的映像的元数据添加一个触发器。该指令不会影响当前的构建。

  2. 在构建结束时,所有触发器的列表存储在映像清单中,在OnBuild键下。可以使用docker inspect命令进行检查。

  3. 稍后,可以使用FROM指令将映像用作新构建的基础。作为处理FROM指令的一部分,下游构建器查找ONBUILD触发器,并按照注册时的顺序执行它们。如果任何一个触发器失败,FROM指令将被终止,从而导致构建失败。如果所有触发器都成功,则FROM指令完成,并像往常一样继续构建。

  4. 触发器在执行后将从最终映像中清除。换句话说,它们不会被“孙辈”建筑所继承。

例如:

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

STOPSIGNAL

STOPSIGNAL signal

STOPSIGNAL指令设置将被发送到容器以退出的系统调用信号。这个信号可以是SIG< name >格式的信号名,例如SIGKILL,或者是一个与内核的系统调用表中的位置匹配的无符号数,例如9。如果没有定义,默认值是SIGTERM。

镜像的默认停止信号可以覆盖每个容器,在docker运行和docker创建时使用——stop-signal标志。

HEALTHCHECK

HEALTHCHECK指令告诉Docker如何测试容器以检查它是否仍在工作。这可以检测web服务器陷入无限循环,无法处理新连接等情况,即使服务器进程仍在运行。
有两种形式:

  • HEALTHCHECK [OPTIONS] CMD command (check container health by running a command inside the container)
  • HEALTHCHECK NONE (disable any healthcheck inherited from the base image)

OPTIONS有以下选项:

  • –interval=DURATION (default: 30s)
  • –timeout=DURATION (default: 30s)
  • –start-period=DURATION (default: 0s)
  • –start-interval=DURATION (default: 5s)
  • –retries=N (default: 3)

运行状况检查将在容器启动后的一段时间内首次运行,然后在每次前一次检查完成后的一段时间内再次运行。

如果检查的单次运行时间超过timeout秒,则认为检查失败。

需要重试连续失败的健康检查,容器才会被认为不健康。

Start period为需要启动时间的容器提供初始化时间。在此期间的探测失败将不计入最大重试次数。但是,如果在启动期间运行状况检查成功
,则认为容器已启动,并且所有连续失败都将计入最大重试次数。
“start-interval”是指开始周期内两次健康检查的时间间隔。此选项需要Docker引擎25.0或更高版本。

一个Dockerfile中只能有一条HEALTHCHECK指令。如果您列出了多个HEALTHCHECK,那么只有最后一个HEALTHCHECK会生效。

CMD关键字后的命令可以是shell命令(如HEALTHCHECK CMD /bin/check-running)或exec数组

该命令的退出状态表示容器的健康状态。可能的值是:

  • 0:成功,容器时健康的
  • 1:非健康的,容器不是正确的运行
  • 2:保留的,不要使用这个值

例如,每隔五分钟左右检查一次网络服务器是否能够在三秒钟内为网站主页提供服务:

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

为了方便Debug,命令在标准输出或标准错误上写入的任何输出文本(UTF-8编码)都将存储在健康状态中,并且可以使用docker inspect进行查询。这样的输出应该保持较短(目前只存储前4096字节)。

SHELL

SHELL ["executable", "parameters"]

SHELL指令允许覆盖用于SHELL形式命令的默认SHELL。Linux系统默认shell为[“/bin/sh”, “-c”], Windows系统默认shell为[“cmd”, “/S”, “/C”]。SHELL指令必须在Dockerfile中以JSON形式编写。

SHELL指令在Windows上特别有用,因为Windows上有两种常用且完全不同的本机SHELL: cmd和powershell,以及包括sh在内的备用SHELL。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hudi Clustering

核心概念 Hudi Clustering对于在数据写入和读取提供一套相对完善的解决方案。它的核心思想就是&#xff1a; 在数据写入时&#xff0c;运行并发写入多个小文件&#xff0c;从而提升写入的性能&#xff1b;同时通过一个异步&#xff08;也可以配置同步&#xff0c;但不推荐&…

SQL注入绕过正则及无列名注入

渗透测试 一、select\b[\s\S]*\bfrom正则二、科学计数法绕过三、过滤information四、无列名注入1、利用 join-using 注列名。2、无列名查询 五、报错注入7大常用函数1.ST_LatFromGeoHash()&#xff08;mysql>5.7.x&#xff09;payload 2.ST_LongFromGeoHash&#xff08;mysq…

3 - Electron app BrowserWindow对象-关于窗口

优雅的打开应用~ 当加载缓慢&#xff0c;打开应用的一瞬间会出现白屏&#xff0c;以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

C#文件操作(一)

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第20章《文件》 二、操作文件的相关类 在C#应用程序中Syste.IO名称空间包含用于在文件中读写数据的类。在此我列举一下File、Directory、Path、FileInfo、DirectoryInfo、FileSystemInfo、FileSystemWatcher。其中在Syste…

pnpm :无法加载文件 D:\nodejs\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

目录 一、问题描述 二、原因分析 三、解决问题 一、问题描述 pnpm : 无法加载文件 D:\learningsoftware\nodejs\node_global\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID1351 70 中的 a…

文件包含 [SWPUCTF 2021 新生赛]include

打开题目 要求我们传入一个file进去&#xff0c;那我们get传入 /?file1 得到源码&#xff0c;并且提示我们flag在flag,php下 在源代码中&#xff0c;我们看见了allow_url_include函数&#xff0c;我们知道这涉及到文件包含。 一般默认allow_url_fopen是on的&#xff0c;那在…

线性回归中的似然函数、最大似然估计、最小二乘法怎么来的(让你彻底懂原理)收官之篇

图1 图2 图3 图4 问1&#xff1a;为什么要引入似然函数&#xff1f; 在线性回归中引入似然函数是为了通过概率统计的方法对模型参数进行估计。简单来说&#xff0c;我们希望找到一组参数&#xff0c;使得我们观测到的数据在给定这组参数的情况下最有可能发生。 问:1&#xf…

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合&#xff0c;实现对这些数据…

Android Canvas状态save与restore,Kotlin

Android Canvas状态save与restore&#xff0c;Kotlin private fun f1() {val bitmap BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val canvas Canvas(bitmap)val paint Paint(Paint.ANTI_ALIAS_FLAG)paint.color Color.RED…

信息收集 - 网站架构

网站架构组成 通常,一个典型的网站架构包括以下组件: 动态脚本语言:动态脚本语言用于处理网站的逻辑和动态内容生成。常见的动态脚本语言包括PHP、Python、Ruby和Node.js等。这些脚本语言可以根据用户请求生成动态的网页内容。 数据库:数据库用于存储网站的数据,包括用户…

网易面试:亿级用户,如何做微服务底层架构?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 微服务改造&#xff0c;你是怎么做的&#xff1…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

路由表route

目录 Windows维护路由表&#xff0c;利用route命令&#xff0c;VPN完美异地组网什么是多网络环境这里我做个情景演示重置ipv4网络再次确认一下网络背景网关是什么多网络规划思路最后拓展内容实测一下网关切换选项网关的网关命令整理 Windows维护路由表&#xff0c;利用route命令…

补题与周总结:leetcode第 376 场周赛

文章目录 复盘与一周总结2967. 使数组成为等数数组的最小代价&#xff08;中位数贪心 回文数判断&#xff09;2968. 执行操作使频率分数最大&#xff08;中位数贪心 前缀和 滑窗&#xff09; 复盘与一周总结 wa穿了第3题&#xff0c;赛时其实想到了思路&#xff1a;中位数贪心…

中央空调冷却塔循环水全自动加药装置PH电导率设备工作原理动画

一&#xff1a;全自动加药装置【概述】 随着在给水、排水处理过程中&#xff0c;常常投加各类化学药剂作为阻垢、杀菌灭藻、混凝、絮凝用&#xff0c;以达到净化水的目的。这些药剂有固体颗粒、液体&#xff0c;在投加过程中必须溶解、稀释及按配比定量投加方能取得最佳效果&am…

GZ015 机器人系统集成应用技术样题6-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题6 选手须知&#xff1a; 本任务书共 25页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

DC-8靶场

目录 DC-8靶场链接&#xff1a; 首先进行主机发现&#xff1a; sqlmap得到账号密码&#xff1a; 反弹shell&#xff1a; exim4提权&#xff1a; Flag&#xff1a; DC-8靶场链接&#xff1a; https://www.five86.com/downloads/DC-8.zip 下载后解压会有一个DC-8.ova文件…

西门子S71200系列PLC通过PROFINET连接多功能电表

西门子S71200连接多功能电表 1、需求描述&#xff1a; 通过西门子S7-1200系列PLC&#xff0c;连接多功能电表&#xff0c;通过Modbus协议读写电表的数据。 2、方案描述&#xff1a; 桥接器的网口连接西门子S7-1200系列PLC的网口&#xff0c;串口连接到电表的485通讯口&#x…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …