Docker Compose孤立容器警告

99

当你有两个独立的项目并且想让它们同时工作,或者至少在已经为另一个项目构建了图像时,在不使用--remove-orphans标志的情况下构建运行docker-compose up -d时,该如何处理孤儿镜像。

docker compose文件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正在被许多其他开发人员使用,我不想更改它。

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

第二件事:这只是一个警告消息,但由于某种原因,在它出现后,组合失败并显示错误:

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

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


我在系统中也遇到了两个不同用户的这个问题。 - Kostanos
将位于名为similar的文件夹中的两个不相关堆栈分开,例如proj1/x_name,proj2/x_name。您现在可以通过顶级名称“name: proj_name”来具体命名它们:https://docs.docker.com/compose/compose-file/#name-top-level-element - Eugen Konkov
9个回答

103
Compose使用项目名称(默认为项目目录的基本名称)来内部隔离项目。项目名称用于为项目的所有容器和其他资源创建唯一标识符。例如,如果您的项目名称是myapp,并且它包括两个服务db和web,则Compose分别启动名为myapp_db_1和myapp_web_1的容器。您会收到“发现孤立的容器”警告,因为docker-compose检测到属于另一个具有相同名称的项目的某些容器。为了防止不同的项目互相干扰(并抑制警告),您可以使用以下任何选项设置自定义项目名称:
  • 命令行选项-p
  • COMPOSE_PROJECT_NAME环境变量。该环境变量也可以通过环境文件(默认情况下为当前工作目录中的.env)进行设置。
  • Compose文件中的顶级name元素。注意:如果您通过-f选项向docker-compose传递多个文件,则将使用最后一个文件中的值。

34
有时候我真的很讨厌 Docker 文档会省略这样重要的细节。我已经花费了太多时间试图弄清楚为什么 docker-compose 将两个完全独立的 YML 文件视为同一项目的一部分,甚至自己得出结论,这一定与项目名称有关。+1 - user188654
6
我的两个不同项目位于目录 C:\somedir1\dockerC:\somedir2\docker 中。但我认为 docker-compose 只获取外层文件夹(docker)作为项目名称,而不是整个路径。因此,在我的情况下设置 docker-compose 的项目名称是必需的。 - Emre Tapcı
为什么项目名称不能在 docker-compose.yml 文件中指定? - marko kraljevic
1
@markokraljevic 如果通过 -f 选项有多个文件,如果它们都有一个“项目”,它会使用哪个? - escape-llc
请查看@user626201在此解决方案中关于如何设置COMPOSE_PROJECT_NAME环境变量的说明。 - Binar Web
1
@markokraljevic:现在你可以了:https://docs.docker.com/compose/compose-file/#name-top-level-element - Eugen Konkov

56

21
为了补充其他回答,我在我的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/


19
docker-compose up --remove-orphans

你可以运行此命令清除孤立的容器。如警告中所指定。


10
请问如何在不使用--remove-orphans的情况下完成它? - Filip Nikolov
2
@FilipNikolov 但是我们中的许多人是通过谷歌搜索来了解如何实际上删除孤立节点的。虽然我在运行命令上收到了警告,而不是在up命令上。 - AntonOfTheWoods

16
如果孤立的容器是预期存在且不打算删除,您可以将COMPOSE_IGNORE_ORPHANS变量设置为true。
简明但可立即使用的源代码在此处
一种选项是将其作为一行放入.env文件中,与docker-compose.yml相邻,如下所示:
COMPOSE_IGNORE_ORPHANS=True

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

sh:

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

1
这对于 docker-compose run 不起作用。 - PIG208

5

简述

你还可以在每个Compose文件中添加一个独特的名称myproject

我的经历

如果有人在寻找解决上述问题的帮助(这是对这里已有很好评论的支持),我分享一下我的经验:

我在同一个目录下有几个配置文件。

redis.yml
mariadb.yml
...

每次运行时,我不断收到有关孤立容器的相同错误提示。

docker-compose -f <one of my configs>.yml up

目前,您可以将每个yml文件简单地放入单独的项目中。这可以使用命令行参数“-p my_project_name”来完成,就像之前已经提到的那样。但是,名称必须全部小写!

这让我更接近目标,但我也不断忘记在使用docker-compose将docker容器停止时包括该参数。

例如,要启动容器:

docker-compose -p myproject-d redis.yml up -d

并销毁容器

docker-compose -p myproject-d redis.yml down

今天我发现可以简单地在yml配置文件中添加 name: 一项。以下是关于Redis的示例:
version: '3.9'
name: redis
services:
  redis_0:
     ...

现在,我只需要使用以下内容启动容器,就不用再担心项目名称的问题了:
docker-compose -f redis.yml <up/down>

3
这对我很有用并且加上了-d参数,使其在后台运行:
docker-compose up -d --remove-orphans

0
作为对现有答案的补充,如果你使用 `docker-compose` 命令时带上 `-f` 选项,让我惊讶的是 docker-compose 将会使用通过 `-f` 传递的第一个文件所在的父文件夹的名称作为项目名称。
例如,假设以下文件夹结构:
/
└── Users/
    └── papb/
        ├── a.yml
        └── foo/
            └── b.yml
  • 如果你在 /Users 目录下运行命令 docker-compose -f papb/a.yml -f papb/foo/b.yml
    • 项目名称将被推断为 papb
    • 两个文件中的相对路径将相对于 /Users/papb 解析
  • 如果你在 /Users 目录下运行命令 docker-compose -f papb/foo/b.yml -f papb/a.yml
    • 项目名称将被推断为 foo
    • 两个文件中的相对路径将相对于 /Users/papb/foo 解析
  • 如果你在 /Users/papb 目录下运行命令 docker-compose -f foo/b.yml -f a.yml
    • 项目名称将被推断为 foo
    • 两个文件中的相对路径将相对于 /Users/papb/foo 解析

0
这种情况通常是由于docker-compose文件更新导致的。我在Docker启动时遇到了类似的错误,后来发现另一个团队成员在清理过程中更新了docker-compose.yml文件。 为了解决这个问题,我使用Docker Desktop中的删除按钮删除了docker组,并重新启动了它。这样就解决了我的错误。enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接