docker 撰写孤立容器警告

docker compose orphan containers warning

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

docker 编写文件 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撰写文件:

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 时,我看到警告:

WARNING: Found orphan containers (docker_workspace_1, docker_nginx_1, docker_php_1, docker_mysql_1, docker_memcached_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.

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

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

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

ERROR: Encountered errors while bringing up the project.

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

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

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

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

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

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

为了防止不同的项目相互干扰(并抑制警告),您可以使用 -p command line option or the COMPOSE_PROJECT_NAME environment variable. The environment variable can also be set via an environment file(默认情况下在当前工作目录中的 .env)设置自定义项目名称。

为了以其他答案为基础,我用我的 docker 撰写项目创建了一个 .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/

docker-compose up --remove-orphans

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

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

Consise 但马上可用的来源是 here

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

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

当您的 docker-compose 文件已更新时会发生这种情况。我在 Docker 启动时收到类似的错误,并发现另一个团队成员更新了 docker-compose.yml 作为清理的一部分。 为了解决这个问题,我使用 Docker 桌面中的删除按钮删除了 docker 组,然后重新启动它。这为我修复了错误。