如何组织多个dockerfile, docker-compose.Yaml和.dockerignore



在回顾了如何命名Dockerfiles的答案后,我仍然有很多问题。

在我的情况下,我需要至少两个Dockerfile,一个docker-compose.yaml和一个.dockerignore。听起来,使用<purpose>.DockerfileDockerfile.<purpose>这样的扩展具有失去在hub.docker.com上使用autobuilder的功能的缺点。

这样其他人建议你保持一个目录中的每个Dockerfile和构建。

可能是这样的:

dockerfiles/
--python_consumer/
-----Dockerfile
--python_producer/
-----Dockerfile
--docker-compose.yaml
--.dockerignore

.dockerignore在这种情况下是否对所有dockerfiles全局有效?这种结构有什么大的缺点吗?

我的docker-compose.yaml示例,没有单独的目录和一个组合的消费者/生产图像作为上下文

version: '3.8'
services:
standalone:
hostname: standalone
container_name: standalone
image: apachepulsar/pulsar:2.8.1
ports:
- 8080:8080 # exposed would be a better practice
- 6650:6650 # exposed would be a better practice
command: bin/pulsar standalone
healthcheck:
test: ["CMD", "nc", "-vz", "localhost", "6650"]
interval: 20s
timeout: 5s
retries: 5
networks:
- conprod
conprod:
hostname: conprod
container_name: conprod
build:
context: .
dockerfile: ./Dockerfile
restart: on-failure # best practice is probably "unless-stopped"
depends_on:
- standalone
networks:
- conprod
networks:
conprod:

当你构建一个镜像时,你给Docker守护进程发送一个构建上下文;在Compose设置中,这是build: { context: }设置中命名的目录。.dockerignore文件必须在这个确切的目录中,不能在其他任何地方。它的实际效果是导致文件被排除在构建上下文之外,这可以导致更快的构建序列。

构建上下文的另一个重要影响是,所有DockerfileCOPY指令都被认为是相对于该目录的;您不能从父目录或兄弟目录中COPY。因此,如果文件在项目之间共享,你必须将上下文目录设置为将包含的所有文件的祖先目录,并且COPY指令将相对于该目录(即使Dockerfiles在每个项目目录中)。还看到如何包含文件外的码头工人的构建背景?

如果你的项目是完全独立的:可能有一个前端和一个后端项目,或者在您的例子中,生产者和消费者共享消息格式,但没有任何实际代码。在本例中:

  • 在每个项目子目录
  • 中放置一个Dockerfile,命名为Dockerfile
  • 在每个项目子目录中放置一个.dockerignore文件(不能在父目录中)
  • COPY指令相对于项目的子目录
    COPY requirements.txt ./
    
  • 在撰写文件中,您可以使用简写的build: directory语法,因为您有标准(默认)dockerfile:名称
    version: '3.8'
    services:
    producer:
    build: ./python_producer
    environment:
    - RABBITMQ_HOST=rabbitmq
    consumer:
    build: ./python_consumer
    environment:
    - RABBITMQ_HOST=rabbitmq
    rabbitmq:
    image: rabbitmq:3
    hostname: rabbitmq # RabbitMQ is very unusual in needing to set this
    

如果您的项目共享代码或其他文件:在您的示例中,可能您在共享代码中为消息格式定义了Python数据结构。在本例中:

  • 在每个项目子目录
  • 中放置一个Dockerfile,命名为Dockerfile
  • 在项目根目录下放置单个.dockerignore文件
  • COPY指令是相对于项目根目录的
    COPY python_producer/requirements.txt ./
    
  • 在Compose文件中,你需要指定context: .dockerfile:指向每个组件的Dockerfile
    version: '3.8'
    services:
    producer:
    build:
    context: .
    dockerfile: python_producer/Dockerfile
    environment:
    - RABBITMQ_HOST=rabbitmq
    consumer:
    build:
    context: .
    dockerfile: python_consumer/Dockerfile
    environment:
    - RABBITMQ_HOST=rabbitmq
    rabbitmq:
    image: rabbitmq:3
    hostname: rabbitmq # RabbitMQ is very unusual in needing to set this
    

最新更新