项目包括多个Dockerfiles和共享一些文件的应用程序.如何构建



我有一个包含多个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文件,构建并删除该文件。哇!

最新更新