Как реализовать изменения, внесенные в docker-compose.yml, в отдельные запущенные контейнеры - PullRequest
0 голосов
/ 09 января 2019

В настоящее время проект выполняется в фоновом режиме с помощью этой команды:

docker-compose up -d

Мне нужно внести два изменения в их docker-compose.yml:

  • Добавить новый контейнер
  • Обновить предыдущий контейнер, чтобы иметь ссылку на новый контейнер

После внесения изменений:

ПРИМЕЧАНИЕ стрелки "<--" для моих изменений

web:
        build: .
        restart: always
        command: ['tini', '--', 'rails', 's']
        environment:
            RAILS_ENV: production
            HOST: example.com
            EMAIL: admin@example.com
        links:
                - db:mongo
                - exim4:exim4.docker # <-- Add link
        ports:
                - 3000:3000
        volumes:
                - .:/usr/src/app
db:
        image: mongo
        restart: always
exim4: # <-------------------------------- Add new container
        image: exim4
        restart: always
        ports:
            - 25:25
        environment:
            EMAIL_USER: user@example.com
            EMAIL_PASSWORD: abcdabcdabcdabcd

После внесения изменений, как их применить? (не разрушая ничего)

Я пытался docker-compose down && docker-compose up -d, но это уничтожило контейнер БД Mongo ... Я не могу этого сделать ... еще раз ...: sob:

docker-compose restart говорит, что не распознает любые изменения, сделанные в docker-compose.yml (Источник: https://docs.docker.com/compose/reference/restart/)

docker-compose stop && docker-compose start звучит так, как будто просто запустит старые контейнеры без моих изменений?


Тестовый сервер:

  • Версия Docker: 1.11.2, сборка b9f10c9 / 1.11.2
  • версия docker-compose: 1.8.0, сборка f3628c7

Рабочий сервер , вероятно, использует более старые версии, не знаете, будет ли это проблемой?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Если вы просто снова запустите docker compose up -d, он заметит новый контейнер и измененную конфигурацию и применит их.

Но:

(не уничтожая ничего)

Существует ряд настроек, которые можно установить только во время запуска контейнера. Если вы измените их, Docker Compose удалит и заново создаст соответствующий контейнер. Например, ссылки доступны только при запуске, поэтому при повторном запуске docker-compose up -d будет удален и заново создан контейнер web.

это уничтожило контейнер БД Mongo ... Я не могу этого сделать ... снова ...

db:
    image: mongo
    restart: always

Добавьте к этому параметр volumes:, чтобы данные сохранялись вне контейнера. Вы можете хранить его в именованном томе, которым, возможно, управляет Docker Compose, что имеет некоторые преимущества, но каталог системы хоста, вероятно, сложнее случайно уничтожить. Вам придется удалить и перезапустить контейнер, чтобы изменить эту опцию. Но учтите, что вам также придется удалить и перезапустить контейнер, если, например, в MongoDB есть обновление безопасности, и вам нужен новый образ.

Ваше идеальное состояние здесь:

  • Фактические базы данных (например, ваш контейнер MongoDB) хранят данные в именованных томах или каталогах хоста
  • Приложения (например, ваш контейнер Rails) ничего не хранят локально и могут быть свободно уничтожены и созданы заново
  • Весь код находится в образах Docker, который всегда можно восстановить из системы контроля версий
  • Используйте тома по мере необходимости для ввода файлов конфигурации и извлечения журналов

Если вы потеряете весь каталог /var/lib/docker (что случается!), Вы не должны потерять ни одно состояние, хотя вы, вероятно, столкнетесь с некоторым простоем приложения.

0 голосов
/ 09 января 2019

Просто docker-compose up -d сделает работу.

Вывод должен быть как

> docker-compose up -d
Starting container1 ... done

> docker-compose up -d
container1 is up-to-date
Creating container2 ... done

Как примечание, docker-compose на самом деле не для производства. Возможно, вы захотите рассмотреть док рой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...