我有一个包含多个Dockerfile的项目。
这棵树就像
.
├── app1
│ ├── Dockerfile
│ ├── app.py
│ └── huge_modules/
├── app2
│ ├── Dockerfile
│ ├── app.py
│ └── huge_modules/
├── common
│ └── my_lib.py
└── deploy.sh
要构建我的应用程序,common/是必要的,我们必须在Dockerfile中复制它
但是,Dockerfile无法从其父目录复制文件。
确切地说,如果我们在项目根目录中使用-f
选项运行docker build
,这是可能的
但我不想这样做,因为构建上下文将过大
在构建app1时,我不喜欢在构建上下文中包含app2/huge_modules/(与构建app2时相同(。
因此,我在每个应用程序目录中准备了一个构建脚本
像这样。
cd $(dirname $0)
cp ../common/* ./
docker build -t app1 .
但这个解决方案在我看来很难看。这个案子有好的解决办法吗?
构建一个包含common
库的基本映像,然后在此基础上构建两个应用程序映像。您可能最终会稍微重组一下,为您的通用文件提供一个Dockerfile:
.
├── app1
│ ├── Dockerfile
│ ├── app.py
│ └── huge_modules/
├── app2
│ ├── Dockerfile
│ ├── app.py
│ └── huge_modules/
├── base
| ├── Dockerfile
| └── common
│ └── my_lib.py
└── deploy.sh
您首先要构建一个基本映像:
docker build -t mybaseimage base/
然后你的app1和app2的Dockerfile将以开头
FROM mybaseimage
一个可能的解决方案是从顶部目录开始构建过程,使用您提到的-f标志,动态生成.dokerignore文件。
也就是说,假设您当前正在构建app1。然后,您将首先在顶部目录中创建一个内容为app2
的.dokerignore文件,然后运行构建过程。完成构建后,删除.dokerignore文件。
现在你想构建app2?没问题!类似地,首先动态生成一个内容为app1
的.dokerignore文件,构建并删除该文件。哇!