【问题标题】:docker compose orphan containers warning码头工人撰写孤儿容器警告
【发布时间】:2018-11-29 13:41:32
【问题描述】:

当您有 2 个独立的项目并且您希望它们同时工作或至少在没有 --remove-orphans 标志的情况下构建运行 docker-compose up -d 时,如果已经为另一个项目构建了图像,那么如何使用孤立图像。

码头工人撰写文件1:

version: '2'
services:
  applications:
    image: tianon/true
    volumes:
      - ../../:/var/www/vhosts/project1
  nginx:
    build: ./images/nginx
    image: project1/nginx:latest
    ports:
      - "80:80"
    volumes_from:
      -  applications
    networks:
      appnet:
        aliases:
          - project1.app
          - admin.project1.app
  php:
    image: project1/php:latest
    ports:
      - "7778:7778"
    build: 
      context: ./images/php
      dockerfile: Dockerfile
    volumes_from:
      -  applications
    networks:
      -  appnet
  mysql:
    image: project1/mysql:latest
    build: ./images/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      -  mysqldata:/var/lib/mysql
    networks:
      -  appnet
    ports:
      - "33066:3306"
 workspace:
    image: project1/workspace:latest
    build:
      context: ./images/workspace
    volumes_from:
      - applications
    working_dir: /var/www/vhosts/project1
    networks:
      -  appnet
networks:
  appnet:
    driver: "bridge"
volumes:
   mysqldata:
    driver: "local"

第二个 docker compose 文件:

version: '2'
services:
  project2_applications:
    image: tianon/true
    volumes:
      - ../../:/var/www/vhosts/project2
  project2_nginx:
    build: ./images/nginx
    image: project2/nginx:latest
    ports:
      - "8080:80"
    volumes_from:
      -  project2_applications
    networks:
      project2_appnet:
        aliases:
          - project2.app
          - admin.project2.app
  project2_php:
    image: project2/php:latest
    ports:
      - "7777:7777"
    build: 
      context: ./images/php
      dockerfile: Dockerfile
    volumes_from:
      -  project2_applications
    networks:
      -  project2_appnet
  project2_mysql:
    image: project2/mysql:latest
    build: ./images/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      -  project2_mysqldata:/var/lib/mysql
    networks:
      -  project2_appnet
    ports:
      - "33067:3306"
  project2_workspace:
    image: project2/workspace:latest
    build:
      context: ./images/workspace
    volumes_from:
      - project2_applications
    working_dir: /var/www/vhosts/videosite
    networks:
      -  project2_appnet
networks:
  project2_appnet:
    driver: "bridge"
volumes:
   project2_mysqldata:
    driver: "local"

现在,当我已经构建了 project1 并尝试为第二个项目运行 docker-compose up -d 时,我看到了警告:

警告:找到此项目的孤立容器(docker_workspace_1、docker_nginx_1、docker_php_1、docker_mysql_1、docker_memcached_1)。如果您在撰写文件中删除或重命名了此服务,则可以使用 --remove-orphans 标志运行此命令来清理它。

我推测这是因为 project1 的容器名称应该更具体,我需要添加一些前缀,就像我为 project2 所做的那样,但 project1 已被许多其他开发人员使用,我不想更改它.

有没有办法关闭孤儿检查?

第二件事:只是一条警告消息,但由于某种原因,它出现后 compose 失败并出现错误:

错误:启动项目时遇到错误。

为了让它工作,我需要运行docker-compose up -d --remove-orphans

【问题讨论】:

  • 我对系统中的两个不同用户也有这个问题

标签: docker docker-compose containers project


【解决方案1】:

Compose 在内部使用项目名称(默认为项目目录的基本名称,但可以明确指定)将项目相互隔离。项目名称用于为所有项目的容器和其他资源创建唯一标识符。例如,如果您的项目名称是 myapp,并且它包含两个服务 dbweb,那么 Compose 会分别启动名为 myapp_db_1myapp_web_1 的容器。

您收到"Found orphan containers" 警告,因为docker-compose 检测到某些容器属于另一个同名项目

为防止不同项目相互干扰(并抑制警告),您可以使用-p command line optionCOMPOSE_PROJECT_NAME environment variable 设置自定义项目名称。环境变量也可以通过environment file(默认在当前工作目录中.env)来设置。

【讨论】:

  • 有时候我真的很讨厌 Docker 文档忽略了这些重要的细节。我花了太多时间试图弄清楚为什么docker-compose 将两个完全独立的 YML 文件视为同一个项目的一部分,甚至自己得出结论,它必须与项目名称相关联。 +1
  • 我的两个独立项目位于C:\somedir1\dockerC:\somedir2\docker 目录中。但我认为 docker-compose 只是将封闭文件夹(docker)作为项目名称,而不是整个路径。因此,为 docker-compose 设置项目名称是强制性的。
【解决方案2】:

docker-compose 将其所在目录的名称作为默认项目名称。

您可以使用-p--project-name 设置不同的项目名称。 https://docs.docker.com/compose/reference/#use--p-to-specify-a-project-name

我遇到了类似的问题,因为我的项目都有docker/docker-compose.yml 结构。

【讨论】:

    【解决方案3】:

    为了构建其他答案,我使用我的 docker compose 项目创建了一个 .env 文件。我有许多项目都使用docker 目录,但它们是不同的项目。

    使用docker-compose -p 容易出错,所以在与docker-compose.yml 相同的目录下创建.env 文件:

    -rw-rw-r--  1 auser auser 1692 Aug 22 20:34 docker-compose.yml
    -rw-rw-r--  1 auser auser   31 Aug 22 20:44 .env
    

    减轻记住-p的必要开销。

    .env 文件中,我现在可以设置COMPOSE_PROJECT_NAME 变量:

    COMPOSE_PROJECT_NAME=myproject
    

    运行中:

    docker-compose up -d
    

    COMPOSE_PROJECT_NAME 被替换而不使用-p

    参考: https://docs.docker.com/compose/env-file/

    【讨论】:

      【解决方案4】:

      如果孤立容器是预期的并且不打算删除,您可以将 COMPOSE_IGNORE_ORPHANS 变量设置为 true。

      简洁但马上工作的来源是here

      一种选择是将其作为一行放入.env 文件中docker-compose.yml 旁边,如下所示:

      COMPOSE_IGNORE_ORPHANS=True
      

      另一个选项是传递或将其设置为环境变量。

      嘘:

      COMPOSE_IGNORE_ORPHANS=True docker-compose up -d 
      

      export COMPOSE_IGNORE_ORPHANS=True
      docker-compose up -d 
      

      命令:

      SET COMPOSE_IGNORE_ORPHANS=True&& docker-compose up -d
      

      powershell:

      $env:COMPOSE_IGNORE_ORPHANS = 'True'; & docker-compose up -d
      

      【讨论】:

        【解决方案5】:
        docker-compose up --remove-orphan
        

        您可以运行此命令来清理孤立容器。如警告中所述

        【讨论】:

        • 问的问题是没有--remove-orphans怎么办
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2020-09-08
        • 2019-02-13
        • 1970-01-01
        • 2018-03-29
        • 2021-10-10
        相关资源
        最近更新 更多