Docker合成孤立容器警告

fxnxkyjh  于 2022-11-02  发布在  Docker
关注(0)|答案(8)|浏览(273)

当你有两个独立的项目,你想让他们同时工作,或者当图像已经为另一个项目构建时,至少构建运行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时,我看到警告:
警告:找到此项目的孤立容器(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

ivqmmu1c

ivqmmu1c1#

合成使用***项目名称***(预设为项目目录的基底名称),以将项目彼此隔离。项目名称是用来建立所有项目容器和其他资源的唯一识别码。例如,如果您的项目名称是myapp,而且它包含两个服务dbweb,则合成将分别启动名为myapp_db_1myapp_web_1的容器。
您会收到"Found orphan containers"警告,因为docker-compose检测到一些容器属于另一个 * 同名 * 的项目。
若要防止不同的项目相互干扰(并抑制警告),可以使用以下任一选项来设置自定义项目名称:

  • -p命令行选项。
  • COMPOSE_PROJECT_NAME环境变量。此环境变量也可以通过environment file(默认情况下,.env位于当前工作目录中)进行设置。
  • 合成文件中得顶级name元素.注意:如果通过-f选项将多个文件传递给docker-compose,则将使用最后一个文件中的值。
fgw7neuy

fgw7neuy2#

docker-compose将其所在目录的名称作为默认项目名称。
您可以使用-p--project-name来设定不同的项目名称。https://docs.docker.com/compose/reference/#use--p-to-specify-a-project-name
我也遇到过类似的问题,因为我的项目都有docker/docker-compose.yml结构。

vof42yt1

vof42yt13#

为了在其他答案的基础上进行构建,我创建了一个.env文件,其中包含我的docker compose项目。
使用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

在不使用X1M9N1X的情况下取代X1M8N1X。
参考:https://docs.docker.com/compose/env-file/

1wnzp6jl

1wnzp6jl4#

docker-compose up --remove-orphans

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

mspsb9vt

mspsb9vt5#

如果孤立容器是预期的,并且不打算删除,则可以将COMPOSE_IGNORE_ORPHANS变量设置为true。
考虑一下,但马上工作源就在这里了。
一种方法是将其作为.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

动力外壳:

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

vu8f3i0k6#

TL;DR

您还可以添加唯一的***名称:myproject***添加到每个合成文件。
"我的旅程"
如果这有助于其他人四处搜寻,以找到上述问题的帮助(这是在支持已经很好的评论在这里):
我在同一目录中有多个配置文件

redis.yml
mariadb.yml
...

当我运行时,我总是得到关于孤立容器的相同错误

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

到目前为止,你可以简单地把每个yml文件放到一个单独的项目中。2这可以简单地用命令来完成,比如参数“-p my_project_name”,就像前面已经提到的那样。3但是名字必须全部小写!
这让我更接近了一点,但我也一直忘记,要使用docker-compose来关闭docker容器,我还需要包括该参数。
例如启动容器:

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

并销毁容器

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

今天我发现我可以简单地将***name:***bit添加到yml config中。下面是一个redis的例子:

version: '3.9'
name: redis
services:
  redis_0:
     ...

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

docker-compose -f redis.yml <up/down>
7gs2gvoe

7gs2gvoe7#

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

6fe3ivhb

6fe3ivhb8#

作为对现有答案的补充,如果您使用带有-f选项的docker-compose,令我惊讶的是,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进行解析

相关问题