Docker:项目中有多个dockerfile

当你有一个用于数据库的Dockerfile,一个用于应用服务器的Dockerfile,等等,你如何组织属于一个项目的Dockerfile ?您是否在源代码中创建了某种层次结构? 一个大的企业项目不能只包含一个Dockerfile?< / p >
187281 次浏览

作者的注意

这个答案已经过时了。 Fig不再存在,已被码头工人组成取代。

.接受的答案不能被删除

Docker Compose支持项目层次结构的构建。所以现在很容易在每个子目录中支持Dockerfile。

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
└── Dockerfile

原来的答案

我只是为每个组件创建了一个包含Dockerfile的目录。例子:

当构建容器时,只要给出目录名,Docker就会选择正确的Dockerfile。

较新的docker版本(>=1.8.0)中,你可以这样做

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

大省。

编辑:更新版本每raksja的评论

编辑:来自@vsevolod的评论:可以通过给文件. dockerfile扩展名(而不是名称)来在VS代码中获得语法高亮显示,例如Prod.Dockerfile, Test。Dockerfile等等。

当处理一个需要使用多个dockerfile的项目时,只需在一个单独的目录中创建每个dockerfile。例如,

< p >应用程序/ db / < / p >

上面的每个目录都包含它们的dockerfile。当应用程序正在构建时,docker将搜索所有目录并构建所有dockerfile。

在不同的目录中使用docker-compose和多个Dockerfile

不要重命名你的DockerfileDockerfile.dbDockerfile.web,它可能不被你的IDE支持,你将失去语法高亮显示。

作为金斯利·乌赫诺尔说,你可以有多个Dockerfile,每个目录一个,它们代表你想要构建的东西。

我喜欢有一个docker文件夹来保存每个应用程序及其配置。下面是一个有数据库的web应用程序的项目文件夹层次结构示例。

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
   └── Dockerfile

docker-compose.yml例子:

version: '3'
services:
web:
# will build ./docker/web/Dockerfile
build: ./docker/web
ports:
- "5000:5000"
volumes:
- .:/code
db:
# will build ./docker/db/Dockerfile
build: ./docker/db
ports:
- "3306:3306"
redis:
# will use docker hub's redis prebuilt image from here:
# https://hub.docker.com/_/redis/
image: "redis:alpine"

docker-compose命令行使用示例:

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d


# get help
docker-compose --help

如果你需要父文件夹中的文件作为Dockerfile构建上下文的一部分

你仍然可以使用上面的解决方案,并将你的Dockerfile放在诸如docker/web/Dockerfile这样的目录中,你所需要的只是在你的docker-compose.yml中设置构建context,如下所示:

version: '3'
services:
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- "5000:5000"
volumes:
- .:/code

文件层次结构是这样的:

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

./docker/web/Dockerfile将从上下文中访问所需的文件,如下所示:

FROM alpine:latest


COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

还要注意,构建上下文将包含指定目录下的所有文件。确保使用.dockerignore文件来防止加载不需要的大文件或目录,以节省构建过程中的时间。

下面是来自tldr docker-compose的一些快速命令。确保你参考官方文档获取更多细节。

添加一个抽象层,例如,在这个项目https://github.com/larytet/dockerfile-generator中添加一个YAML文件,看起来像

centos7:
base: centos:centos7
packager: rpm
install:
- $build_essential_centos
- rpm-build
run:
- $get_release
env:
- $environment_vars

一个简短的Python脚本/make可以从配置文件生成所有dockerfile。

在Intellij中,我简单地将docker文件的名称更改为*。Dockerfile,并关联文件类型*。Dockerfile到docker的语法。