Answers:
这个答案已经过时了。无花果不再存在,已经被Docker compose取代。接受的答案无法删除....
Docker Compose支持构建项目层次结构。因此,现在很容易在每个子目录中支持Dockerfile。
├── docker-compose.yml
├── project1
│ └── Dockerfile
└── project2
└── Dockerfile
我只是为每个组件创建一个包含Dockerfile的目录。例:
在构建容器时,只需提供目录名称,Docker将选择正确的Dockerfile。
在较新版本(> = 1.8.0)的docker中,您可以执行此操作
docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
节省了很多。
编辑:根据raksja的评论更新版本
编辑:@vsevolod的评论:通过提供文件.Dockerfile扩展名(而不是名称),例如Prod.Dockerfile,Test.Dockerfile等,可以在VS代码中突出显示语法。
Dockerfile.web
作为运行配置。因此,我创建了一个问题: youtrack.jetbrains.com/issue/WEB-28185
docker-compose.yml
文件中定义的每个“服务”应使用哪个Dockerfile ?
docker-compose
和多个Dockerfile
不要将您的名称重命名
Dockerfile
为Dockerfile.db
或Dockerfile.web
,您的IDE可能不支持该名称,并且您将丢失语法高亮显示。
正如Kingsley Uchnor所说,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
的目录,例如docker/web/Dockerfile
,所有你需要的是设置构建context
在docker-compose.yml
这样的:
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 /
这是tldr docker-compose的一些快速命令。请确保参考官方文档以了解更多详细信息。
COPY ../package.json /app/package.json
)上安装deps 怎么办?该文件通常位于根级别,并且docker禁止访问父级。您将采用哪种方法?
web
的项目.
(在docker-compose.yml
:build: .
)。这样,web
在构建时可以访问根文件。我已经看到了一个相关的问题:stackoverflow.com/questions/24537340/…,我们可以使用docker
命令行从父目录进行构建,而这个答案说明了如何使用docker-compose来做到这一点:stackoverflow.com/a/45353241/ 1092815
-f
选项很好,但是我更喜欢docker-compose
与子文件夹一起使用。我认为这两个答案都是有效的。大多数人可能只喜欢保留默认Dockerfile
名称以支持大多数IDE。我并没有使第一个答案无效,我只是提供了一个替代方法。我只是不希望我的IDE在使用时认为Dockerfile是php
文件Dockerfile.php
,但是可以,它可以工作。我已经在docker文档中看到了一些示例;Dockerfile.build
,Dockerfile.debug
等等
example.Dockerfile
在VSCode上保留语法突出显示和图标。
在Intellij中,我简单地将docker文件的名称更改为* .Dockerfile,并将文件类型* .Dockerfile关联至docker语法。
添加一个抽象层,例如,像该项目中的YAML文件https://github.com/larytet/dockerfile-generator看起来像
centos7:
base: centos:centos7
packager: rpm
install:
- $build_essential_centos
- rpm-build
run:
- $get_release
env:
- $environment_vars
简短的Python脚本/ make可以从配置文件生成所有Dockerfile。
在需要使用多个dockerfile的项目上工作时,只需在单独的目录中创建每个dockerfile。例如,
应用程序/数据库/
以上每个目录都将包含其dockerfile。构建应用程序时,docker将搜索所有目录并构建所有dockerfile。