我一直在研究Docker映像,该映像从github存储库中提取必要的文件,然后自行构建。它打算每次都从github更新自身,但要对其进行测试,我每次运行时都会删除整个github repo文件夹。
删除文件夹后,我开始获取
致命:目标路径'Project-4'已经存在,并且不是 空目录。
Dockerfile(构建映像的文件)的内容为:
FROM python:3.7
WORKDIR /usr/src/app
CMD ["sh", "-c", "git clone https://github.com/nathanhtaylor/Project-4.git && cd ./Project-4 && pip install -r requirements.txt && python server.py"]
这台机器上的任何地方都没有目录Project-4
。无论图像用完了哪个文件夹,都会发生此错误。手动运行git clone http://github.com/nathanhtaylor/Project-4.git
可以正常工作。
答案 0 :(得分:0)
构建Docker映像的方式存在缺陷。 Docker镜像应该是不可变的,即一旦构建它们,您应该只能使用构建的可执行文件运行它,而不能对其进行更改。 Docker镜像的版本可以像您的源代码一样进行版本控制。
在您的示例中,您试图在CMD中进行构建,获取依赖关系和执行所有过程,这与必须如何使用容器以及为什么使用容器以及它们试图解决的问题的原则背道而驰。
我建议阅读这篇文章,以了解为什么需要不可变性
https://medium.com/sroze/why-i-think-we-should-all-use-immutable-docker-images-9f4fdcb5212f
对于您的Dockerfile,我建议您对其进行更改,以获取git存储库和要求,作为docker构建步骤的一部分,并且不使用CMD,而仅将可执行文件保留在其中。
在您所说的情况下,如果远程git存储库有任何更改并相应地对其进行版本化并标记为最新标记,则理想地,您的CI(连续集成)或任何其他管道都应该有一个阶段从头开始重建Docker映像。 >
此外,this链接是一种使用远程git存储库构建docker映像的好方法,如果您不想使用各种CI管道,这在您的情况下可能会有用。