COPY 复制文件
格式:
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
源路径可以是多个,甚至可以使通配符,规则满足 Go 的 filepath.Math
规则。
例如:
COPY hom* /mydir/
目标路径可以使容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以使用 WORKDIR
指令指定)。目标目录不存在会自动创建缺失目录。
可以理解为 COPY 源文件 目标文件
,这里的源文件
一开始容易出错,这个是你针对当前文件夹下路径来说的,即使你写的是/root/.pip/pip.conf
,其实,它执行 build 时,会寻找的路径是get-pip/root/.pip/pip.conf
,你理解了吗?
COPY . /app
COPY ./.pip/pip.conf ~/.pip/pip.conf
和 COPY 作用类似的有一个叫 ADD 的命令,他俩有什么区别呢?简单来讲, ADD 命令可以实现,当你源文件是压缩包时,它会自动解压并复制到你指定的目标文件,而且,ADD 命令的源文件还可以是一个 URL,但正是它功能的强大也给用户带来了不确定性,所以 Docker 官方并不太推荐使用 ADD 这个命令。
ADD 更高级的复制
ADD
指令和 COPY
指令相比,它的源路径可以是一个 URL
,这种情况,Docker 引擎会试图去下载这个链接的文件放到目标路径下。下载后的文件权限自动设置为 600
。如果需要修改,加一层 RUN
命令进行权限调整。
另外,如果下载的是压缩包,也需要使用 RUN
指令进行解压缩。所以,不弱直接使用 RUN
指令,然后使用 wget
或者 curl
工具下载进行操作。
如果源路径是一个 tar
压缩文件,压缩格式为 gzip
,bzip2
以及 xz
情况时, ADD
指令将自动解压缩这个文件放到目录路径下。
例如:
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
Dockerfile 最佳实践文档中要求,尽可能使用 COPY
指令,因为它的语义更明确。
ENTRYPOINT
当指定了 ENTRYPOINT
后,CMD
的含义就发生了改变,不再是直接的运行其命令,而是将 CMD
的内容作为参数传给 ENTRYPOINT
指令,换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"
CMD 命令会被 镜像名之后的命令重新替换掉
参考
WORKDIR
用来切换工作目录所用,如果目录没有,它还会自动给你创建这个目录。要避免如下的使用方法,你会发现 app
目录下根本就不会有 world.txt
内容:
RUN cd /app
RUN echo "hello" > world.txt
参考
.dockerignore
构建镜像时,Docker需要先准备context ,将所有需要的文件收集到进程中。默认的context包含Dockerfile目录中的所有文件,但是实际上,我们并不需要.git目录,node_modules目录等内容。忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少Docker镜像的大小。
.git/
node_modules
Reference
- Gitbook-yeasy-Dockerfile 指令详解
- Github-python/3.7/stretch/Dockerfile
- seanlook-Dockerfile指令详解
- 纯洁的微笑-Docker(三):Dockerfile 命令详解
- DockerHub 查看学习 Dockerfile 的好地方
编写 Dockerfile 实践