分享一些Dockerfile新手会遇到的坑
先说这不是教程啊,我也是新手,如果你还不清楚基本的用法,建议直接阅读Dockerfile reference
COPY会遇到的坑
一般官网都会放上COPY用法的指令,但是通过看指令,实在是不敏感,甚至会出现很多误解的情况,最后导致docker build不成功。
用法我还是贴一下
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY的作用是可以将本地的组建复制到容器当中去,在构建镜像的时候使用,分享两个官网例子看一下
COPY test.txt relativeDir/
复制test.txt文件到relativeDir目录去,但是他使用了相对路径,dockerfile就会根据上一个WORKDIR来拼接路径
那最后test.txt文件的位置就会在<WORKDIR>/relativeDir/。
如果使用绝对路径就不会有这个问题,来看
COPY test.txt /absoluteDir/
注意这都不是坑,目前来说都很OK,新手可能会发现这好像跟Linux系统的cp命令差不多啊。
坑在于,官网没有给复制目录的用例,但是在下方用文字来做补充解释了,如果新手没看到,就会踩坑。
坑点在于
- 如果<src>是一个目录,那么包括文件系统的metadata,目录内全部的内容会被复制,注意!目录本身不会被复制
我们创建一个repo目录,然后在内部创建一个test.txt,像这样/app/repo/test.txt
现在我们要复制repo内所有的内容进入容器
如果你理解成CP了,那么你可能会把这条命令写成这样
WORKDIR /app COPY ./repo/ ./
后续的构建还需要利用repo里面的东西,此刻你可能觉的容器内的目录已经被你构建成了这样/app/repo/test.txt
实际上,容器内部的目录结构需要你自己构建,repo目录并不会复制过去
结果是这样的
如果你理解成CP
改成
COPY ./repo/ /repo/