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


作者的注意

这个答案已经过时了。图不再存在,已被Docker合成所取代。 接受的答案不能被删除。

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

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

原来的答案

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

设置docker / fig Mesos环境

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


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

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

大省。

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

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


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

。.app/ 。.db/

上面的每个目录都包含它们的dockerfile。当应用程序正在构建时,docker将搜索所有目录并构建所有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构建上下文的一部分

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

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的语法。