Docker:项目中有多个Dockerfile


214

当您有一个用于数据库的Dockerfile,一个用于应用程序服务器的Dockerfile等时,如何组织属于项目的Dockerfile?您是否在源代码中创建了某种层次结构?一个大型企业项目不能仅由一个Dockerfile组成吗?


15
您可能需要更改接受的答案
庞巴

3
应该有一个“投票”选项,并自动将过时的“已接受”属性移至更合适的答案。采取此举的资格标准可能是:1)说10:1的选票有较大差异; 2)问题作者未登录说了一年或更长时间(看来@LuckyLuke已经退休4年了)前...)
mirekphd

Answers:


6

作者注

这个答案已经过时了。无花果不再存在,已经被Docker compose取代。接受的答案无法删除....

Docker Compose支持构建项目层次结构。因此,现在很容易在每个子目录中支持Dockerfile。

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

原始答案

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

在构建容器时,只需提供目录名称,Docker将选择正确的Dockerfile。


3
@DuncanJones因为您不能删除接受的答案...尝试过:-)
Mark O'Connor

285

较新版本(> = 1.8.0)的docker中,您可以执行此操作

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

节省了很多。

编辑:根据raksja的评论更新版本

编辑:@vsevolod的评论:通过提供文件.Dockerfile扩展名(而不是名称),例如Prod.Dockerfile,Test.Dockerfile等,可以在VS代码中突出显示语法。


2
哪个较新的版本?
raksja

4
刚刚检查过,github.com/docker/docker/wiki,所以它> Docker 1.8.0
raksja 17-4-14

3
确保这可以正常工作,但是我的IDE不会进行任何语法高亮显示,因为它无法识别文件名:(
Alexander Mills

3
@AlexanderMills我的IDE WebStorm甚至不允许Dockerfile.web作为运行配置。因此,我创建了一个问题: youtrack.jetbrains.com/issue/WEB-28185
steampower '17年

5
例如,如何指定docker-compose.yml文件中定义的每个“服务”应使用哪个Dockerfile ?
JoeTidee

127

在单独的目录中使用docker-compose和多个Dockerfile

不要将您的名称重命名DockerfileDockerfile.dbDockerfile.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时需要以前文件夹中的文件

您仍然可以使用上面的解决方案,并把您Dockerfile的目录,例如docker/web/Dockerfile,所有你需要的是设置构建contextdocker-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的一些快速命令。请确保参考官方文档以了解更多详细信息。


1
如果您需要复制软件包管理器文件以在构建时间(fi COPY ../package.json /app/package.json)上安装deps 怎么办?该文件通常位于根级别,并且docker禁止访问父级。您将采用哪种方法?
nass600

1
我打的太限制和处理这个例外,我建web的项目. (在docker-compose.ymlbuild: .)。这样,web在构建时可以访问根文件。我已经看到了一个相关的问题:stackoverflow.com/questions/24537340/…,我们可以使用docker命令行从父目录进行构建,而这个答案说明了如何使用docker-compose来做到这一点:stackoverflow.com/a/45353241/ 1092815
GabLeRoux

1
这是您的IDE的问题,而不是docker的问题。@硕有正确答案。
BentOnCoding

1
第二个答案是1岁,但它不是直接来自Docker的文档。-f选项很好,但是我更喜欢docker-compose与子文件夹一起使用。我认为这两个答案都是有效的。大多数人可能只喜欢保留默认Dockerfile名称以支持大多数IDE。我并没有使第一个答案无效,我只是提供了一个替代方法。我只是不希望我的IDE在使用时认为Dockerfile是php文件Dockerfile.php,但是可以,它可以工作。我已经在docker文档中看到了一些示例;Dockerfile.buildDockerfile.debug等等
GabLeRoux

3
命名为example.Dockerfile在VSCode上保留语法突出显示和图标。
vmassuchetto


3

添加一个抽象层,例如,像该项目中的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。


1

在需要使用多个dockerfile的项目上工作时,只需在单独的目录中创建每个dockerfile。例如,

应用程序/数据库/

以上每个目录都将包含其dockerfile。构建应用程序时,docker将搜索所有目录并构建所有dockerfile。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.