Dockerfile COPY 的诡异事件以及解决方案
在制作 docker 镜像时,有复制某一个路径下所有文件和文件夹到镜像的需求,写下了如下 dockerfile:
FROM alpine COPY ./* /root/
原始目录结构是这样的:
/projects/test_docker_proj ├── Dockerfile ├── dir1 │ ├── dir11 │ │ └── file11 │ └── file1 └── file2
然而复制到 docker 镜像里的目录结构变成了这样:
/root/test_docker_proj ├── Dockerfile ├── dir11 │ └── file11 ├── file1 └── file2
可以看到 dir1 这个文件夹并没有被复制到镜像里,但是 dir1 中的子文件夹和文件都被复制进来了,和 dir1 同级的文件也被复制了。也就是说,在 COPY 执行的过程中,第一层文件夹被「解包」了
docker 的 COPY/ADD
在复制文件夹时复制的是其内容
docker 的这种「奇怪」的逻辑已经被诟病许久了,但是似乎还没有要改变的意思
当一个项目中是托管到git上,Dockerfile 必然也是在项目中的
git clone 的时候 Dockerfile 跟项目在同一级,没办法方便的COPY项目文件到docker中
把Dockerfile 移动到上一层又佷不人性化。
绞尽脑汁的解决方案(也不是佷人性化)
FROM alpine COPY $PWD /root/
这个时候要求docker build 的时候要在Dockerfile的当前路径下