diff --git a/image/dockerfile/add.md b/image/dockerfile/add.md index b5b753b..3c3a2dc 100644 --- a/image/dockerfile/add.md +++ b/image/dockerfile/add.md @@ -21,3 +21,12 @@ ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz / 另外需要注意的是,`ADD` 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。 因此在 `COPY` 和 `ADD` 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 `COPY` 指令,仅在需要自动解压缩的场合使用 `ADD`。 + +在使用该指令的时候还可以加上 `--chown=:` 选项来改变文件的所属用户及所属组。 + +```Dockerfile +ADD --chown=55:mygroup files* /mydir/ +ADD --chown=bin files* /mydir/ +ADD --chown=1 files* /mydir/ +ADD --chown=10:11 files* /mydir/ +``` diff --git a/image/dockerfile/copy.md b/image/dockerfile/copy.md index a948a64..53914a4 100644 --- a/image/dockerfile/copy.md +++ b/image/dockerfile/copy.md @@ -2,8 +2,8 @@ 格式: -* `COPY <源路径>... <目标路径>` -* `COPY ["<源路径1>",... "<目标路径>"]` +* `COPY [--chown=:] <源路径>... <目标路径>` +* `COPY [--chown=:] ["<源路径1>",... "<目标路径>"]` 和 `RUN` 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。 @@ -23,3 +23,12 @@ COPY hom?.txt /mydir/ `<目标路径>` 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 `WORKDIR` 指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。 此外,还需要注意一点,使用 `COPY` 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。 + +在使用该指令的时候还可以加上 `--chown=:` 选项来改变文件的所属用户及所属组。 + +```Dockerfile +COPY --chown=55:mygroup files* /mydir/ +COPY --chown=bin files* /mydir/ +COPY --chown=1 files* /mydir/ +COPY --chown=10:11 files* /mydir/ +``` diff --git a/image/dockerfile/expose.md b/image/dockerfile/expose.md index ce9ade3..eb707b0 100644 --- a/image/dockerfile/expose.md +++ b/image/dockerfile/expose.md @@ -4,6 +4,4 @@ `EXPOSE` 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 `docker run -P` 时,会自动随机映射 `EXPOSE` 的端口。 -此外,在早期 Docker 版本中还有一个特殊的用处。以前所有容器都运行于默认桥接网络中,因此所有容器互相之间都可以直接访问,这样存在一定的安全性问题。于是有了一个 Docker 引擎参数 `--icc=false`,当指定该参数后,容器间将默认无法互访,除非互相间使用了 `--links` 参数的容器才可以互通,并且只有镜像中 `EXPOSE` 所声明的端口才可以被访问。这个 `--icc=false` 的用法,在引入了 `docker network` 后已经基本不用了,通过自定义网络可以很轻松的实现容器间的互联与隔离。 - 要将 `EXPOSE` 和在运行时使用 `-p <宿主端口>:<容器端口>` 区分开来。`-p`,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 `EXPOSE` 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。 diff --git a/image/dockerfile/user.md b/image/dockerfile/user.md index cf8685f..68af822 100644 --- a/image/dockerfile/user.md +++ b/image/dockerfile/user.md @@ -1,6 +1,6 @@ ### USER 指定当前用户 -格式:`USER <用户名>` +格式:`USER <用户名>[:<用户组>]` `USER` 指令和 `WORKDIR` 相似,都是改变环境状态并影响以后的层。`WORKDIR` 是改变工作目录,`USER` 则是改变之后层的执行 `RUN`, `CMD` 以及 `ENTRYPOINT` 这类命令的身份。