麦克斯仇
Think different
159
文章
27969
阅读
首页
INDEX
文章
ARTICLE
关于
ABOUT
Dockerfile参考
创建日期:
2020/01/28
修改日期:
2023/06/28
Docker
> 未完善,继续整理中 > Docker可以通过读取`Dockerfile`中的指令来自动构建图像。`Dockerfile`是一个文本文档,它包含用户可以在命令行上调用的所有命令来组装一个映像。使用`docker build`,用户可以创建一个连续执行多个命令行指令的自动化构建。 ### FROM 设置基本镜像 > 有效的Dockerfile必须从`FROM`指令开始 ```bash FROM [--platform=<platform>] <image> [AS <name>] FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] FROM [--platform=<platform>] <image>[@<digest>] [AS <name>] ``` ```bash FROM openjdk:8 ``` ### RUN 执行命令并产生新的一层镜像 #### shell 形式 ```bash RUN <command> ``` > 命令在shell中运行,默认情况下在Linux中`/bin/sh -c`,在Windows中`cmd /S /C`。 在shell形式中,可以使用`\`(反斜杠)将一条指令继续到下一行 ```bash # demo1 RUN apt-get update && apt-get install -y # demo2 RUN /bin/bash -c 'source $HOME/.bashrc; \ echo $HOME' ``` #### exec 形式 ```bash RUN ["executable", "param1", "param2"] ``` > exec表单不会调用shell命令,举例如下 ``` # 以下命令将不会对进行变量替换$HOME RUN [ "echo", "$HOME" ] # 如果要进行shell处理,则可以使用shell形式或直接执行shell RUN [ "sh", "-c", "echo $HOME" ] ``` ### CMD 主要用途是为提供容器执行的默认值 > 一个`Dockerfile`中只能有一个`CMD`指令,如果有多个`CMD`指令,则只有最后一个`CMD`才会生效 #### shell 形式 ``` CMD command param1 param2 ``` > 说明与举例同 RUN shell 形式 #### exec 形式 ```bash CMD ["executable","param1","param2"] ``` > 说明与举例同 RUN exec 形式 #### exec 形式,且作为 ENTRYPOINT 的默认参数 ``` CMD ["param1","param2"] ``` > 如果`CMD`用于提供`ENTRYPOINT`指令的默认参数,则`CMD`和`ENTRYPOINT`指令均应使用JSON数组格式指定。 ### ADD 复制文件到容器内 ```bash ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] ``` > `--chown`功能仅在用于构建Linux容器的Dockerfiles上受支持,而在Windows容器上不起作用; `<src>`源文件,可以指定多个,且支持通配符; `<dest>`目标文件,是一个绝对路径,或是一个`WORKDIR`的相对路径; 添加包含特殊字符(例如`[`和`]`)的文件或目录时,您需要按照Golang规则转义这些路径,以防止将它们视为匹配模式。 ``` # 添加所有以 hom 开头的文件 ADD hom* /mydir/ # ?替换为任何单个字符,例如 home.txt ADD hom?.txt /mydir/ # 将 test 添加到 “WORKDIR”/relativeDir/ ADD test relativeDir/ # 在/absoluteDir/中添加 test ADD test /absoluteDir/ # 复制一个名为 arr[0].txt 的文件至 /mydir/ ADD arr[[]0].txt /mydir/ ``` `ADD`规则如下 1. `<src>`路径必须在构建的上下文中;不能使用`ADD ../something /something`。 2. 如果`<src>`是一个URL,并且`<dest>`没有以斜杠结尾,则从该URL下载一个文件并复制到`<dest>`。 3. 如果`<src>`是一个URL,并且`<dest>`以一个斜杠结尾,那么从URL推断文件名,文件被下载到`<dest>/<filename>`。 4. 如果`<src>`是一个目录,则复制目录的全部内容,包括文件系统元数据,包括文件系统元数据。(目录本身不是复制的,只是它的内容。) 5. 如果`<src>`是一个以可识别的压缩格式(identity、gzip、bzip2或xz)进行压缩的本地tar存档,则将其作为目录解压缩。来自远程url的资源不会被解压缩。复制或解压缩目录时,它的行为与tar -x相同。 6. 如果`<src>`是任何其他类型的文件,它将与元数据一起单独复制。在这种情况下,如果`<dest>`以一个斜杠`/`结尾,它将被认为是一个目录,`<src>`的内容将写在`<dest>/base(<src>)`。 7. 如果`<src>`直接或由于使用通配符而指定了多个资源,则`<dest>`必须是目录,并且必须以斜杠`/`结尾。 8. 如果`<dest>`没有以斜杠结尾,它将被视为一个常规文件,`<src>`的内容将被写在`<dest>`。 9. 如果`<dest>`不存在,它将与路径中所有缺少的目录一起创建。 ### COPY 复制文件到容器内 ```bash COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] ``` > `COPY`语法与`ADD`基本相同,`COPY`的<src>不支持URL,`COPY`不支持自动解压压缩文件,`COPY`的规则同`ADD`的规则,仅少2、3、5三条不支持的规则 ### ENV 设置环境变量 > 此值将在构建阶段中所有后续指令的环境中使用 #### 写法一 ```bash ENV <key> <value> ``` > 将一个变量设置为一个值。第一个空格之后的整个字符串将被视为`<value>`-包括空格字符。该值将为其他环境变量解释,因此如果不对引号字符进行转义,则将其删除。 ```bash ENV myName John Doe ENV myDog Rex The Dog ENV myCat fluffy ``` #### 写法二 ```bash ENV <key>=<value> ... ``` > 允许一次设置多个变量。请注意,第二种形式在语法中使用等号(=),而第一种形式则不使用等号(=)。像命令行解析一样,引号和反斜杠可用于在值中包含空格。 ```bash ENV myName="John Doe" myDog=Rex\ The\ Dog \ myCat=fluffy ``` ### EXPOSE 设置端口 ```bash EXPOSE <port> [<port>/<protocol>...] ``` > `EXPOSE`指令通知Docker容器在运行时监听指定的网络端口。可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。 `EXPOSE`指令实际上并不发布端口。它的功能类似于构建映像的人员和运行容器的人员之间的一种文档类型,关于要发布哪些端口。要在运行容器时实际发布端口,可以使用`docker run`上的`-p`标志来发布和映射一个或多个端口,或者使用`-P`标志来发布所有公开的端口并将它们映射到高阶端口。 ```bash # 默认TCP协议 EXPOSE 80 # 同时在TCP和UDP上公开 EXPOSE 80/tcp EXPOSE 80/udp ``` > 如上情况下,如果`-P`与一起使用`docker run`,则该端口仅对TCP公开一次,对于UDP公开一次。请记住,`-P`该端口在主机上使用临时的高阶主机端口,因此该端口对于TCP和UDP将是不同的。 无论`EXPOSE`设置如何,都可以在运行时使用该`-p`标志覆盖它们。例如 ```bash docker run -p 80:80/tcp -p 80:80/udp ... ``` ### LABEL 将元数据添加到镜像中 ```bash LABEL <key>=<value> <key>=<value> <key>=<value> ... ``` > `LABEL`是一个键值对,一个`LABEL`可以指定一个或多个键值对 ```bash # demo1 LABEL "com.example.vendor"="ACME Incorporated" # demo2 LABEL com.example.label-with-value="foo" # demo3 LABEL version="1.0" # demo4 LABEL description="This text illustrates \ that label-values can span multiple lines." # demo5 LABEL multi.label1="value1" multi.label2="value2" other="value3" # demo6 LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3" ``` ### ENTRYPOINT ```bash # exec 形式,首选 ENTRYPOINT ["executable", "param1", "param2"] # shell 形式 ENTRYPOINT command param1 param2 ``` ### USER 用户 ``` USER <user>[:<group>] USER <UID>[:<GID>] ``` ### VOLUME 挂载点 ```bash VOLUME ["/data"] ``` ### WORKDIR 工作目录 ``` WORKDIR /path/to/workdir ``` > `WORKDIR`指令为`Dockerfile`中的任何`RUN`、`CMD`、`ENTRYPOINT`、`COPY`和`ADD`指令设置工作目录。如果`WORKDIR`不存在,即使在后续的`Dockerfile`指令中不使用它,也会创建它。 > `WORKDIR`指令可以在Dockerfile中多次使用。如果提供了一个相对路径,它将相对于前面的WORKDIR指令的路径。例如: ```bash WORKDIR /a WORKDIR b WORKDIR c RUN pwd ``` 这个`Dockerfile`中的最后一个pwd命令的输出是`/a/b/c`。 > `WORKDIR`指令可以解析之前使用`ENV`设置的环境变量。您只能使用在`Dockerfile`中显式设置的环境变量。例如: ```bash ENV DIRPATH /path WORKDIR $DIRPATH/$DIRNAME RUN pwd ``` 这个`Dockerfile`中的最后一个`pwd`命令的输出是`/path/$DIRNAME` ### ARG 略 ### ONBUILD 略 ### STOPSIGNAL 略 ### HEALTHCHECK 略 ### SHELL 略
8
全部评论