【问题标题】:New containers accessing volume on preexisting container新容器访问现有容器上的卷
【发布时间】:2020-01-15 12:41:59
【问题描述】:

我有一个“主”容器,在启动所有其他容器时应该已经在运行。

在其中我有一个conf/ 目录,该服务正在监视和应用相关更改。

如何让每个新容器在此目录中放置一个文件?


真实场景:

鉴于下面的docker-compose.yml,我希望每个服务(portainerwhoamiapache)在"./traefik/conf/:/etc/traefik/conf/" 服务的"./traefik/conf/:/etc/traefik/conf/" 路径映射中删除一个.yml 文件。

docker-compose.yml

version: "3.5"

services:

    traefik:
        image: traefik
        env_file: ./traefik/env
        restart: unless-stopped
        ports:
            - "80:80"
            - "443:443"
            - "8080:8080"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./traefik/conf/:/etc/traefik/conf/
            - ./traefik/traefik.yml:/etc/traefik/traefik.yml

    portainer:
        image: portainer/portainer
        depends_on: [traefik]
        command: --no-auth -H unix:///var/run/docker.sock
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock

    whoami:
        image: containous/whoami
        depends_on: [traefik]

portainer.traefik.yml

http:
    routers:
        portainer:
            entryPoints: [http]
            middlewares: [redirect-to-http]
            service: portainer-preauth@docker
            rule: Host(`portainer.docker.mydomain`)

whoami.traefik.yml

http:
    routers:
        whoami:
            entryPoints: [http]
            middlewares: [redirect-to-http]
            service: whoami-preauth@docker
            rule: Host(`whoami.docker.mydomain`)

portainer.traefik.yml 和 whoami.traefik.yml 文件在哪里 位于?如果它们在主机上,您可以直接将它们复制到 ./traefik/conf/. – 沙申克 V

问题是我无法拥有traefik/conf 中的所有文件。
这将需要在我每次创建新图像时手动将文件放在那里。
我相信每个服务都应该对自己的文件负责。
此外,当traefik 启动并找到其他尚未启动的服务的文件时,它会记录很多错误。
为避免这种行为,我想仅在容器启动时将文件放在那里。

下面是项目文件结构。

【问题讨论】:

  • 文件portainer.traefik.ymlwhoami.traefik.yml 位于何处?如果它们在主机上,您可以直接将它们复制到 ./traefik/conf/.
  • @ShashankV 用文件结构更新了问题。问题是我不想将所有文件都放在 traefik/conf 中。每个服务都应该对其文件负责。此外,当 traefik 启动并找到尚未启动的其他服务的文件时,它会记录很多错误。

标签: docker docker-compose traefik


【解决方案1】:

您可以在所有服务中使用卷。只需在 docker-compose.yml 中定义它并将其分配给每个服务:

version: "3.5"

services:

    traefik:
        image: traefik
        env_file: ./traefik/env
        restart: unless-stopped
        ports:
            - "80:80"
            - "443:443"
            - "8080:8080"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./traefik/conf/:/etc/traefik/conf/
            - ./traefik/traefik.yml:/etc/traefik/traefik.yml
            - foo:/path/to/share/

    portainer:
        image: portainer/portainer
        depends_on: [traefik]
        command: --no-auth -H unix:///var/run/docker.sock
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - foo:/another/path/to/share/

    whoami:
        image: containous/whoami
        depends_on: [traefik]
        volumes:
          - foo:/and/another/path/

    volumes:
      foo:
        driver: local

这相当于“普通”Docker 的--volumes-from 功能。或者至少,最接近它的东西。

您的主容器将不得不使用相同的卷。如果这个容器不在同一个 Docker Compose 上下文中运行,你必须先在外部定义这个卷。

【讨论】:

  • 我正在考虑将文件映射到主机文件系统,而不是 Dockerfile 中的 ADD。那可能吗?我真的在努力避免不断地改变Dockerfile 和重建。
  • 将文件映射到主机文件系统正是您对卷所做的事情。 :) 使用卷时,您不必更改 Dockerfile。 Check this out 了解有关卷以及如何使用它们的良好说明。
猜你喜欢
  • 2019-12-18
  • 2019-07-30
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2016-04-18
  • 2023-03-15
相关资源
最近更新 更多