继续阅读docker文档

This commit is contained in:
2023-02-09 20:40:49 +08:00
parent 9b63b9df01
commit 1190043b71

View File

@@ -263,3 +263,64 @@ that label-values can span multiple lines."
"other": "value3"
}
```
## EXPOSE
```dockerfile
EXPOSE <port> [<port>/<protocol>...]
```
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 ...
```
或者可以考虑ARGARG不会持久化到最终的image中
```dockerfile
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
```
# ADD
ADD指令拥有两种形式
```dockerfile
ADD [--chown=<user>:<group>] [--checksum=<checksum>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
```
如果路径中包含空格,需要使用第二种形式。
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