From 1190043b7106faf2591ab524fb8e7b81bb70bbb7 Mon Sep 17 00:00:00 2001 From: Rikako Wu <496063163@qq.com> Date: Thu, 9 Feb 2023 20:40:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E9=98=85=E8=AF=BBdocker?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/docker file.md | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/docker/docker file.md b/docker/docker file.md index 5d80b29..9608560 100644 --- a/docker/docker file.md +++ b/docker/docker file.md @@ -263,3 +263,64 @@ that label-values can span multiple lines." "other": "value3" } ``` +## EXPOSE +```dockerfile +EXPOSE [/...] +``` +EXPOSE指令会告知Docker该container在监听指定的网络端口,可以指定该端口是在监听TCP或是UDP,默认情况下如果没有指定protocol,默认值为TCP。 +EXPOSE指令实际并不开放端口,其作用只是在build image的人和运行container的人之间提供文档,该文档会告知哪些端口需要被开放。 +> 想要真正的开放端口,需要在运行容器时通过docker run命令指定-p选项来开放和映射端口。 +默认情况下,EXPOSE在未指定协议的情况下使用TCP。可以显式指定开放端口的协议为UDP。 +```dockerfile +EXPOSE 80/udp +``` +可以通过多行EXPOSE指令同时暴露TCP和UDP端口: +```dockerfile +EXPOSE 80/tcp +EXPOSE 80/udp +``` +不管EXPOSE命令如何设置,都可以在`docker run`时通过-p选项来覆盖设置: +```shell +$ docker run -p 80:80/tcp -p 80:80/udp ... +``` +## ENV +ENV指令将环境变量key设置为value,该值可以为后续的指令提供inline替换。 +> 如果双引号没有被转义,那么value中的双引号将会被移除。 + +ENV指令允许一行内设置多条key-value pair。 +```dockerfile +ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \ + MY_CAT=fluffy +``` +通过ENV命令设置的环境变量将会被保留,当container通过resulting image产生时。可以通过docker inspect来查看值,并且通过`docker run --env key=value`的形式来更改。 +> ENV命令设置的key-value对会保留在最终的镜像中,并且在镜像产生的容器中可见。 + +如果环境变量只是在build的过程中需要,并且最终image中不希望存在该环境变量,可以考虑只为单行命令设置value: +```dockerfile +RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ... +``` +或者可以考虑ARG,ARG不会持久化到最终的image中: +```dockerfile +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y ... +``` +# ADD +ADD指令拥有两种形式: +```dockerfile +ADD [--chown=:] [--checksum=] ... +ADD [--chown=:] ["",... ""] +``` +如果路径中包含空格,需要使用第二种形式。 +ADD指令会从`src`拷贝新文件、目录或remote file URL并将其添加到镜像的文件系统中,path为`dest`。 +可以指定复数个`src`资源,但如果`src`为文件或者目录,那么`src`的path将会被解释为相对于build context的路径。 +每个`src`可以含有通配符,示例如下: +```dockerfile +ADD hom* /mydir/ +``` +`?`符号可以匹配任意单个字符,示例如下: +```dockerfile +ADD hom?.txt /mydir/ +``` +`dest`是一个绝对路径,或是相对于`WORKDIR`的相对路径,`src`将会被复制到目标容器中。 +如果想要ADD包含特殊字符的文件或目录(例如`[`或`]`),需要对这些路径进行转义。 +所有新文件和目录创建时,UID和GID都是0,如果想要为新建文件或目录指定其他的值,可以使用`--chown`选项来指定`username:groupname`或`uid:gid \ No newline at end of file