Как быть с потерянными образами, когда у вас есть 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"
второй файл 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 для второго проекта, я вижу предупреждение:
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-orphansflag 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/overview/#use--p-to-specify-a-project-name
У меня была аналогичная проблема, потому что все мои проекты имели структуру docker/docker-compose.yml.
Compose использует название проекта (по умолчанию это базовое имя каталога проекта, но может быть указано явно) внутри, чтобы изолировать проекты друг от друга. Имя проекта используется для создания уникальных идентификаторов для всех контейнеров проекта и других ресурсов. Например, если ваш проект называется myapp и он включает две службы db и web, то Compose запускает контейнеры с именами myapp_db_1 и myapp_web_1 соответственно.
Вы получаете предупреждение "Found orphan containers", потому что docker-compose обнаруживает некоторые контейнеры, принадлежащие другому проекту с таким же именем.
Чтобы разные проекты не мешали друг другу (и подавили предупреждение), вы можете установить собственное имя проекта, используя Параметр командной строки -p или COMPOSE_PROJECT_NAME переменная окружения. Переменная среды также может быть установлена через файл среды (по умолчанию .env в текущем рабочем каталоге).
Два моих отдельных проекта находятся в каталогах C:\somedir1\docker и C:\somedir2\docker. Но я думаю, что docker-compose получает в качестве имени проекта только включающую папку (docker), а не весь путь. Таким образом, установка имени проекта для 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.
docker-compose up --remove-orphan
вы можете запустить эту команду, чтобы очистить ненужные контейнеры. Как указано в предупреждении
Возникает вопрос, как это сделать без --remove-orphans.
Если осиротевшие контейнеры ожидаются и не предназначены для удаления, вы можете установить для переменной COMPOSE_IGNORE_ORPHANS значение true.
Consise, но сразу рабочий источник - здесь.
Один из вариантов - поместить его в файл .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
cmd:
SET COMPOSE_IGNORE_ORPHANS=True&& docker-compose up -d
PowerShell:
$env:COMPOSE_IGNORE_ORPHANS = 'True'; & docker-compose up -d
Бывают случаи, когда я действительно ненавижу документацию Docker за то, что она пропускает такие важные детали. Я потратил слишком много времени, пытаясь понять, почему
docker-composeрассматривает два совершенно разных файла YML как часть одного и того же проекта, и даже сам пришел к выводу, что он должен быть привязан к имени проекта. +1