Docker COPY命令复制未指定文件且不遵守.dockerignore规则问题咨询
别着急,我来帮你理清问题所在:
你看到Dockerfile、run.sh这些文件出现在容器里,核心原因是你运行容器时用了本地目录挂载,而不是镜像本身包含这些文件。
拆解一下逻辑:
构建镜像时,
.dockerignore其实是生效的:
你的.dockerignore里排除了Dockerfile和.dockerignore,而且Dockerfile里只复制了requirements.txt和app文件夹,所以你构建出来的tst镜像里,/usr/src/myapp路径下只有这两个内容,完全没有Dockerfile、run.sh这些文件。你可以直接运行这个命令验证:docker run -it --rm tst ls -l输出里肯定不会有那些额外文件。
问题出在运行容器的挂载命令:
你执行的docker run命令里有-v "$PWD":/usr/src/myapp,这个参数会把你本地当前目录的所有内容,直接挂载到容器内的/usr/src/myapp路径,相当于用本地目录完全替换了镜像里原来的这个目录内容。所以你进入容器后看到的是本地电脑上的文件,和镜像本身无关,.dockerignore自然也管不到挂载的内容。
给你两种解决方案,看你需求选:
方案1:不需要挂载本地目录,直接用镜像内容
如果你只是想运行镜像里的程序,不需要实时同步本地代码,把-v和-w参数调整一下(保留-w指定工作目录即可),运行命令改成:
docker run -it --rm -w /usr/src/myapp tst bash
这样进入容器后,看到的就是镜像里原本的内容:只有app文件夹和requirements.txt。
方案2:需要挂载本地目录,但想排除无关文件
如果你是开发场景,需要挂载本地目录实时修改代码,那可以只挂载需要的app文件夹,而不是整个目录:
docker run -it --rm -v "$PWD/app":/usr/src/myapp/app -w /usr/src/myapp tst bash
这样既可以实时同步本地的app代码,容器里也保留了镜像中安装好的依赖,同时不会把本地的Dockerfile、run.sh等文件带进容器。
内容的提问来源于stack exchange,提问作者Ani

