码头工人撰写孤儿容器警告

Posted

技术标签:

【中文标题】码头工人撰写孤儿容器警告【英文标题】: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

【问题讨论】:

我对系统中的两个不同用户也有这个问题 【参考方案1】:

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

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

为防止不同项目相互干扰(并抑制警告),您可以使用-p command line option 或COMPOSE_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怎么办

以上是关于码头工人撰写孤儿容器警告的主要内容,如果未能解决你的问题,请参考以下文章

牧场主网络码头工人撰写

芹菜多里面码头工人容器

sh 利用nsenter进入码头工人容器

从里面停止码头工人的容器

Akka遥控器在码头工人容器中

码头工人群或牧场牛中的芹菜工人