【问题标题】:Docker: Multiple Dockerfiles in projectDocker:项目中的多个 Dockerfile
【发布时间】:2015-02-09 03:56:29
【问题描述】:

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

【问题讨论】:

  • 您可能想更改接受的答案
  • 应该有一个“投票”选项,并自动将过时的“接受”属性移动到更合适的答案。这种举动的资格标准可能是 1)说投票的巨大差异,10:1 和 2)问题作者没有登录说,一年或更长时间(似乎@LuckyLuke 已经从 SO 4 年退休以前...)
  • 我想更新问题,但已经是256了,上帝帮帮我

标签: docker


【解决方案1】:

newer versions(>=1.8.0) of docker,你可以这样做

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

一个很大的节省。

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

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

【讨论】:

  • 哪个新版本?
  • 刚刚检查过,github.com/docker/docker/wiki,所以它的 > Docker 1.8.0
  • 确保这可行,但我的 IDE 不会做任何语法高亮,因为它无法识别文件名:(
  • @AlexanderMills 我的 IDE WebStorm 甚至不允许 Dockerfile.web 作为运行配置。所以我创建了一个问题:youtrack.jetbrains.com/issue/WEB-28185
  • 例如,如何为docker-compose.yml 文件中定义的每个“服务”指定应使用哪个 Dockerfile?
【解决方案2】:

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

不要将 Dockerfile 重命名为 Dockerfile.dbDockerfile.web,您的 IDE 可能不支持它,您将失去语法高亮。

作为Kingsley Uchnor said,你可以有多个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 /

Here are some quick commands from tldr docker-compose。请务必参考official documentation 了解更多详情。

【讨论】:

  • 如果您需要复制包管理器文件以便在构建时安装 deps 怎么办 (f.i COPY ../package.json /app/package.json)?该文件通常位于根级别,并且 docker 已禁止访问父级。你会采用什么方法?
  • 我也遇到了这个限制,对于这个例外,我从.(在docker-compose.ymlbuild: .)构建了web项目。这样,web 在构建时可以访问根文件。我已经看到了这个相关的问题:stackoverflow.com/questions/24537340/…,我们可以在使用docker 命令行时从父目录构建,这个答案显示了如何使用 docker-compose:stackoverflow.com/a/45353241/1092815
  • 这是您的 IDE 的问题,而不是 docker 的问题。 @Shuo 有正确答案。
  • 第二个答案是 1 岁,但它不是直接取自 Docker 的文档。 -f 选项很好,但我更喜欢将 docker-compose 与子文件夹一起使用。我认为这两个答案都是有效的。大多数人可能更喜欢保留默认的Dockerfile 名称以支持大多数开箱即用的 IDE。我并没有使第一个答案无效,我只是提供了一个替代方案。当我使用Dockerfile.php 时,我只是不喜欢我的IDE 认为我的Dockerfile 是php 文件,但是是的,它可以工作。我在 docker 文档中看到了一些示例; Dockerfile.buildDockerfile.debug
  • 命名为 example.Dockerfile 保持语法高亮和 VSCode 上的图标。
【解决方案3】:

作者注

此答案已过时。 Fig 不再存在并已替换为 Docker compose。 已接受的答案无法删除。

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

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

原答案

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

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

【讨论】:

  • @DuncanJones 因为您无法删除已接受的答案...试过:-)
  • 这种方法的问题是,如果我们需要在构建 docker 镜像的同时将文件从根目录添加到项目文件中,这是一个大问题。
  • 我明白你的意思,是的,更改一个通用文件将意味着所有图像都将被重建。就个人而言,我尽量避免在一个项目中使用多个 Dockerfile。在我遇到这种情况的地方,我构建了一个包含多个二进制文件的单个图像。在运行时,可以使用不同的命令调用图像。
  • +1 用新的可接受的解决方案修改答案,很多人只是留下了贬低的做事方式。
【解决方案4】:

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

【讨论】:

  • 试过了,我得到了一个漂亮的 Docker 图标。
  • 构建 docker 镜像: docker build 。 -f example.Dockerfile
  • 我不明白,如果使用此解决方案,在 Intellij 中,您只需右键单击文件“覆盖文件类型”> 选择 Docker。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    应用程序/ 分贝/

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2020-02-12
      相关资源
      最近更新 更多