我有一个类似以下的项目结构
app/
docker-compose.yml
module1/
Dockerfile
module1.py
module2/
Dockerfile
module2.py
common/
common_things.py
在我的module1的Dockerfile中,
COPY module1.py /app
COPY ../common /app/common
但是Docker不喜欢这第二行。错误低于
ERROR: Service 'module1' failed to build: COPY failed: Forbidden path outside the build context: ../common ()
如何通过Dockerfile或Docker-compose告诉Docker,module1可以从../common
获取文件?我可以使用符号链接进行公共链接,以便module1和module2在各自的目录中具有公共链接,但这感觉像是过分杀伤……
额外的荣誉:跨Docker容器共享文件的最佳实践是什么?也许还有另一种我不知道的方法。
答案 0 :(得分:0)
您可以通过将整个应用程序目录作为构建上下文来传递。
docker-compose.yml
看起来像这样:
version: '3'
services:
module1:
build:
context: ./
dockerfile: module1/Dockerfile
...
第一个Dockerfile
应该是这样的:
...
COPY module1/module1.py /app
COPY common /app/common
...
一些其他评论:
通常,您会将两个Docker映像的公共部分发布为共享库。我对python不太熟悉,但是我认为它可以归结为:
common_things.py
作为python程序包发布到某些python存储库中,以便可以通过pip install
进行安装requirements.txt
文件,并在其中引用您的python包pip install -r requirements.txt
,将common_things-package
安装在docker-image中。但是,这对于您的用例来说可能是过大的,所以我认为您的文件共享解决方案可能是您的不错选择。