项目中有多个Dockerfiles

Luc*_*uke 182 docker

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

Shu*_*huo 248

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

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .
Run Code Online (Sandbox Code Playgroud)

一个很大的节省.

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

  • 例如,如何指定应该在`docker-compose.yml`文件中定义的每个'服务'使用哪个Dockerfile? (5认同)
  • 刚刚检查过,https://github.com/docker/docker/wiki,所以它的> Docker 1.8.0 (4认同)
  • @AlexanderMills我的IDE WebStorm甚至不允许`Dockerfile.web`作为运行配置.所以我创建了一个问题:https://youtrack.jetbrains.com/issue/WEB-28185 (3认同)
  • 哪个版本较新? (2认同)
  • 确定这有效,但我的IDE不会做任何语法高亮,因为它无法识别文件名:( (2认同)
  • @AlexanderMills 您还可以将文件命名为 db.Dockerfile、web.Dockerfile 等,然后智能感知会将它们识别为 dockerfiles (2认同)
  • 从 2019 年(或更早)开始,可以通过给文件提供 .Dockerfile 扩展名(而不是名称)来在 VS 代码中获得语法突出显示,例如 Prod.Dockerfile、Test.Dockerfile 等。 (2认同)
  • 我想通了:我仍然需要提供构建上下文,它是一个目录。因此请注意“docker build -ftests/Dockerfile.pytest”末尾的点。 (2认同)

Gab*_*oux 100

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

不要将您重命名Dockerfile为,Dockerfile.db或者Dockerfile.web您的IDE可能不支持它,您将失去语法突出显示.

正如Kingsley Uchnor所说,你可以拥有多个Dockerfile,每个目录一个,代表你想要构建的东西.

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

docker-compose.yml
docker
??? web
?   ??? Dockerfile
??? db
    ??? Dockerfile
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果您在构建Dockerfile时需要先前文件夹中的文件

您仍然可以使用上面的解决方案,并把您Dockerfile的目录,例如docker/web/Dockerfile,所有你需要的是设置构建contextdocker-compose.yml这样的:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code
Run Code Online (Sandbox Code Playgroud)

这样,你就可以拥有这样的东西:

config-on-root.ini
docker-compose.yml
docker
??? web
    ??? Dockerfile
    ??? some-other-config.ini
Run Code Online (Sandbox Code Playgroud)

./docker/web/Dockerfile这样:

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /
Run Code Online (Sandbox Code Playgroud)

以下是来自tldr docker-compose的一些快速命令.请务必参阅官方文档以获取更多详细信息.

  • 命名为`example.Dockerfile`可在VSCode上保持语法高亮和图标. (3认同)
  • 如果您需要复制包管理器文件以便在构建时安装 deps (fi `COPY ../package.json /app/package.json`) 怎么办?该文件通常位于根级别,并且 docker 禁止访问父级。你会采用什么方法? (2认同)
  • 为了在 IDE 中突出显示这种非常简单的文件格式的语法,需要添加很多复杂性。 (2认同)

小智 12

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

  • 试过了,我得到了一个不错的 Docker 图标。 (3认同)

Mar*_*nor 5

作者注

这个答案已经过时了。无花果不再存在,已经被Docker compose取代。


原始答案

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

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

  • 这种方法的问题是,如果我们在构建 docker 镜像时需要将根目录中的文件添加到项目文件中,那就是一个大问题。 (4认同)
  • @DuncanJones因为您无法删除一个已接受的答案,所以尝试过:-) (2认同)