Docker создает предупреждение о сиротских контейнерах

Как быть с потерянными образами, когда у вас есть 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-orphans flag to clean it up.

У меня есть предположение, что это потому, что имена контейнеров для project1 должны быть более конкретными, и мне нужно добавить некоторые префиксы, как я делаю для project2, но project1 используется многими другими разработчиками, и я не хочу его менять.

Есть ли способ отключить проверку сирот?

И второе: это просто предупреждающее сообщение, но по какой-то причине после его появления compose выдает ошибку:

ERROR: Encountered errors while bringing up the project.

И чтобы он заработал, мне нужно запустить docker-compose up -d --remove-orphans.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
40
0
46 113
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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 в текущем рабочем каталоге).

Бывают случаи, когда я действительно ненавижу документацию Docker за то, что она пропускает такие важные детали. Я потратил слишком много времени, пытаясь понять, почему docker-compose рассматривает два совершенно разных файла YML как часть одного и того же проекта, и даже сам пришел к выводу, что он должен быть привязан к имени проекта. +1

brezanac 11.02.2020 14:44

Два моих отдельных проекта находятся в каталогах C:\somedir1\docker и C:\somedir2\docker. Но я думаю, что docker-compose получает в качестве имени проекта только включающую папку (docker), а не весь путь. Таким образом, установка имени проекта для docker-compose является обязательной в моем случае.

Emre Tapcı 30.04.2021 14:20

Чтобы опираться на другие ответы, я создаю файл .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.

Справка: https://docs.docker.com/compose/env-file/

docker-compose up --remove-orphan

вы можете запустить эту команду, чтобы очистить ненужные контейнеры. Как указано в предупреждении

Возникает вопрос, как это сделать без --remove-orphans.

Filip Nikolov 14.09.2020 21:46

Если осиротевшие контейнеры ожидаются и не предназначены для удаления, вы можете установить для переменной 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

Другие вопросы по теме