docker compose 孤儿容器警告

Bog*_*byk 47 containers project docker docker-compose

如何与孤儿图像时,你有2个独立的项目,并且希望他们能够在同一时间工作,或者至少建立运行docker-compose up -d,而不--remove-orphans标志时,图像已经建成的其他项目。

码头工人撰写文件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"
Run Code Online (Sandbox Code Playgroud)

第二个 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"
Run Code Online (Sandbox Code Playgroud)

现在,当我已经构建了 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

Eug*_*ash 45

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

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

为了防止不同的项目相互干扰(并抑制警告),您可以使用-p命令行选项COMPOSE_PROJECT_NAME环境变量设置自定义项目名称。也可以通过环境文件.env默认在当前工作目录中)设置环境变量。

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

bob*_*bob 38

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

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

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


小智 20

docker-compose up --remove-orphans
Run Code Online (Sandbox Code Playgroud)

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

  • 提出的问题是如何在没有“--remove-orphans”的情况下做到这一点 (10认同)
  • @FilipNikolov,但我们很多人从谷歌来到这里寻找如何真正“删除”孤儿。虽然我在 *run* 命令上收到警告,但在 *up* 命令上没有收到警告。 (2认同)

mou*_*ick 16

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

简洁但马上工作源就在这里

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

COMPOSE_IGNORE_ORPHANS=True
Run Code Online (Sandbox Code Playgroud)

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

嘘:

COMPOSE_IGNORE_ORPHANS=True docker-compose up -d 
Run Code Online (Sandbox Code Playgroud)

或者

export COMPOSE_IGNORE_ORPHANS=True
docker-compose up -d 
Run Code Online (Sandbox Code Playgroud)

命令:

SET COMPOSE_IGNORE_ORPHANS=True&& docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

电源外壳:

$env:COMPOSE_IGNORE_ORPHANS = 'True'; & docker-compose up -d
Run Code Online (Sandbox Code Playgroud)


use*_*201 10

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

使用docker-compose -p有点容易出错,因此.env在与以下内容相同的目录中创建文件docker-compose.yml

-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
Run Code Online (Sandbox Code Playgroud)

减轻了记忆的必要开销-p

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

COMPOSE_PROJECT_NAME=myproject
Run Code Online (Sandbox Code Playgroud)

运行时:

COMPOSE_PROJECT_NAME=myproject
Run Code Online (Sandbox Code Playgroud)

COMPOSE_PROJECT_NAME被取代的,而无需使用-p

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


Aci*_*awk 5

长话短说

您还可以向每个撰写文件添加唯一的名称:myproject 。

我的旅程

如果这可以帮助其他人寻找上述问题的帮助(这是为了支持这里已经很好的评论):

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

redis.yml
mariadb.yml
...
Run Code Online (Sandbox Code Playgroud)

当我运行时,我不断收到有关孤立容器的相同错误

docker-compose -f <one of my configs>.yml up
Run Code Online (Sandbox Code Playgroud)

到目前为止,您可以简单地将每个 yml 文件放入一个单独的项目中。这只需使用前面已经提到过的参数“-p my_project_name”之类的命令即可完成。 名称必须全部小写!

这让我更接近了一些,但我也一直忘记,要使用 docker-compose 关闭 docker 容器,我还需要包含该参数。

例如启动容器:

docker-compose -p myproject-d redis.yml up -d
Run Code Online (Sandbox Code Playgroud)

并销毁容器

docker-compose -p myproject-d redis.yml down
Run Code Online (Sandbox Code Playgroud)

今天我发现我可以简单地将name: bit 添加到 yml 配置中。这是一个 redis 的例子:

version: '3.9'
name: redis
services:
  redis_0:
     ...
Run Code Online (Sandbox Code Playgroud)

现在我可以简单地使用以下命令启动容器,而不必再次担心项目名称:

docker-compose -f redis.yml <up/down>
Run Code Online (Sandbox Code Playgroud)