当您有2个独立项目并且希望它们同时工作,或者至少已经构建了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 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,因此我不想更改它。有什么办法可以关闭孤立检查吗?
第二件事:只是警告消息,但由于某种原因,它在显示compose后失败,并出现错误 ERROR:启动项目时遇到错误。。为了使其正常工作,我需要运行docker-compose up -d --remove-orphans
答案 0 :(得分:5)
要基于其他答案,我用docker compose项目创建了一个.env
文件。我有许多项目都使用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
减轻了记住-p
的必要开销。
在.env
文件中,我现在可以设置COMPOSE_PROJECT_NAME
变量:
COMPOSE_PROJECT_NAME=myproject
正在运行:
docker-compose up -d
在不使用COMPOSE_PROJECT_NAME
的情况下替换了-p
。
答案 1 :(得分:3)
docker-compose up --remove-orphan
您可以运行此命令来清理孤立容器。如警告中所述
答案 2 :(得分:2)
如果孤立容器是预期的并且不打算移除,您可以将 <VirtualHost *:80>
ServerName localhost
DocumentRoot C:/MAMP/htdocs
</VirtualHost>
<VirtualHost *:80>
ServerName simplesamlphp
DocumentRoot C:/MAMP/htdocs/pro-dashboard
Alias /simplesaml C:/MAMP/simplesamlphp/www
<Directory C:/MAMP/htdocs/pro-dashboard>
Order allow,deny
Allow from all
AllowOverride All
</Directory>
</VirtualHost>
变量设置为 true。
简明但马上工作的源代码是 here。
一种选择是将其作为一行放入 COMPOSE_IGNORE_ORPHANS
旁边的 .env
文件中,如下所示:
docker-compose.yml
另一个选项是传递或将其设置为环境变量。
sh:
COMPOSE_IGNORE_ORPHANS=True
或
COMPOSE_IGNORE_ORPHANS=True docker-compose up -d
命令:
export COMPOSE_IGNORE_ORPHANS=True
docker-compose up -d
powershell:
SET COMPOSE_IGNORE_ORPHANS=True&& docker-compose up -d
答案 3 :(得分:1)
Compose在内部使用 项目名称 (默认为项目目录的基本名称,但可以显式指定),以将项目彼此隔离。项目名称用于为项目的所有容器和其他资源创建唯一的标识符。例如,如果您的项目名称为myapp
并且包括两个服务db
和web
,则Compose分别启动名为myapp_db_1
和myapp_web_1
的容器。>
您收到"Found orphan containers"
警告,因为docker-compose
检测到一些容器属于另一个项目,具有相同的名称。
要防止不同项目相互干扰(并消除警告),可以使用-p
command line option或COMPOSE_PROJECT_NAME
environment variable设置自定义项目名称。
答案 4 :(得分:0)
docker-compose
将目录名称作为默认项目名称。
您可以使用-p
或--project-name
设置不同的项目名称。
https://docs.docker.com/compose/reference/overview/#use--p-to-specify-a-project-name
我遇到了类似的问题,因为我的项目都具有docker/docker-compose.yml
结构。