Update Dockerfile

Signed-off-by: khs1994 <khs1994@khs1994.com>
pull/371/head
khs1994 2018-11-02 08:26:50 +08:00
parent dfa885f4f0
commit 1b306447ef
No known key found for this signature in database
GPG Key ID: 0A380828B1C243A7
4 changed files with 21 additions and 5 deletions

View File

@ -21,3 +21,12 @@ ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
另外需要注意的是,`ADD` 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
因此在 `COPY``ADD` 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 `COPY` 指令,仅在需要自动解压缩的场合使用 `ADD`
在使用该指令的时候还可以加上 `--chown=<user>:<group>` 选项来改变文件的所属用户及所属组。
```Dockerfile
ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/
```

View File

@ -2,8 +2,8 @@
格式:
* `COPY <源路径>... <目标路径>`
* `COPY ["<源路径1>",... "<目标路径>"]`
* `COPY [--chown=<user>:<group>] <源路径>... <目标路径>`
* `COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]`
`RUN` 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。
@ -23,3 +23,12 @@ COPY hom?.txt /mydir/
`<目标路径>` 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 `WORKDIR` 指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。
此外,还需要注意一点,使用 `COPY` 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。
在使用该指令的时候还可以加上 `--chown=<user>:<group>` 选项来改变文件的所属用户及所属组。
```Dockerfile
COPY --chown=55:mygroup files* /mydir/
COPY --chown=bin files* /mydir/
COPY --chown=1 files* /mydir/
COPY --chown=10:11 files* /mydir/
```

View File

@ -4,6 +4,4 @@
`EXPOSE` 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 `docker run -P` 时,会自动随机映射 `EXPOSE` 的端口。
此外,在早期 Docker 版本中还有一个特殊的用处。以前所有容器都运行于默认桥接网络中,因此所有容器互相之间都可以直接访问,这样存在一定的安全性问题。于是有了一个 Docker 引擎参数 `--icc=false`,当指定该参数后,容器间将默认无法互访,除非互相间使用了 `--links` 参数的容器才可以互通,并且只有镜像中 `EXPOSE` 所声明的端口才可以被访问。这个 `--icc=false` 的用法,在引入了 `docker network` 后已经基本不用了,通过自定义网络可以很轻松的实现容器间的互联与隔离。
要将 `EXPOSE` 和在运行时使用 `-p <宿主端口>:<容器端口>` 区分开来。`-p`,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 `EXPOSE` 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

View File

@ -1,6 +1,6 @@
### USER 指定当前用户
格式:`USER <用户名>`
格式:`USER <用户名>[:<用户组>]`
`USER` 指令和 `WORKDIR` 相似,都是改变环境状态并影响以后的层。`WORKDIR` 是改变工作目录,`USER` 则是改变之后层的执行 `RUN`, `CMD` 以及 `ENTRYPOINT` 这类命令的身份。