首页 > 解决方案 > 新容器访问现有容器上的卷

问题描述

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

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

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


真实场景:

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

码头工人-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]

搬运工.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/。– 沙申克五世

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

下面是项目文件结构。

项目文件结构

标签: dockerdocker-composetraefik

解决方案


您可以在所有服务中使用卷。只需在 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 上下文中运行,你必须先在外部定义这个卷。


推荐阅读