当你有两个独立的项目,你想让他们同时工作,或者当图像已经为另一个项目构建时,至少构建运行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
8条答案
按热度按时间ivqmmu1c1#
合成使用***项目名称***(预设为项目目录的基底名称),以将项目彼此隔离。项目名称是用来建立所有项目容器和其他资源的唯一识别码。例如,如果您的项目名称是
myapp
,而且它包含两个服务db
和web
,则合成将分别启动名为myapp_db_1
和myapp_web_1
的容器。您会收到
"Found orphan containers"
警告,因为docker-compose
检测到一些容器属于另一个 * 同名 * 的项目。若要防止不同的项目相互干扰(并抑制警告),可以使用以下任一选项来设置自定义项目名称:
-p
命令行选项。COMPOSE_PROJECT_NAME
环境变量。此环境变量也可以通过environment file(默认情况下,.env
位于当前工作目录中)进行设置。name
元素.注意:如果通过-f
选项将多个文件传递给docker-compose
,则将使用最后一个文件中的值。fgw7neuy2#
docker-compose
将其所在目录的名称作为默认项目名称。您可以使用
-p
或--project-name
来设定不同的项目名称。https://docs.docker.com/compose/reference/#use--p-to-specify-a-project-name我也遇到过类似的问题,因为我的项目都有
docker/docker-compose.yml
结构。vof42yt13#
为了在其他答案的基础上进行构建,我创建了一个
.env
文件,其中包含我的docker compose项目。使用
docker-compose -p
容易出错,因此在与docker-compose.yml
相同的目录中创建.env
文件:减轻了记忆
-p
的必要开销。在
.env
文件中,我现在可以设置COMPOSE_PROJECT_NAME
变量:运行时:
在不使用X1M9N1X的情况下取代X1M8N1X。
参考:https://docs.docker.com/compose/env-file/
1wnzp6jl4#
您可以运行此命令来清理孤立容器。如警告中所指定
mspsb9vt5#
如果孤立容器是预期的,并且不打算删除,则可以将
COMPOSE_IGNORE_ORPHANS
变量设置为true。考虑一下,但马上工作源就在这里了。
一种方法是将其作为
.env
文件中docker-compose.yml
旁边的一行,如下所示:另一个选项是传递或将其设置为环境变量。
嘘:
或
指令:
动力外壳:
vu8f3i0k6#
TL;DR
您还可以添加唯一的***名称:myproject***添加到每个合成文件。
"我的旅程"
如果这有助于其他人四处搜寻,以找到上述问题的帮助(这是在支持已经很好的评论在这里):
我在同一目录中有多个配置文件
当我运行时,我总是得到关于孤立容器的相同错误
到目前为止,你可以简单地把每个yml文件放到一个单独的项目中。2这可以简单地用命令来完成,比如参数“-p my_project_name”,就像前面已经提到的那样。3但是名字必须全部小写!
这让我更接近了一点,但我也一直忘记,要使用docker-compose来关闭docker容器,我还需要包括该参数。
例如启动容器:
并销毁容器
今天我发现我可以简单地将***name:***bit添加到yml config中。下面是一个redis的例子:
现在,我可以简单地使用以下代码启动容器,而不必再担心项目名称:
7gs2gvoe7#
当您的Docker-compose文件被更新时会发生这种情况。我在Docker启动时收到类似的错误,并发现另一个团队成员在清理过程中更新了docker-compose.yml。为了解决这个问题,我使用Docker桌面中的“删除”按钮删除了Docker组,然后重新启动它。这为我解决了这个错误。x1c 0d1x
6fe3ivhb8#
作为对现有答案的补充,如果您使用带有-f选项的
docker-compose
,令我惊讶的是,docker-compose将使用的名称(通过-f传递的第一个文件的父文件夹)作为项目名称。例如,假设文件夹结构如下:
/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
进行解析