как я могу создать контейнер данных только с помощью docker-compose.yml?

Этот вопрос связан с проблемой в репозитории Docker:
https://github.com/docker/compose/issues/942

Я не могу понять, как создать контейнер данных (процесс не запущен) с помощью docker compose.


person ivan    schedule 02.10.2015    source источник
comment
Начиная с Docker 1.9 контейнеры только для данных можно заменить именованными контейнерами github.com/docker/docker/ вопросы/17798   -  person Peeter Kokk    schedule 12.07.2016
comment
Если вы хотите использовать именованные тома для указания точки подключения хоста, см. следующее: stackoverflow.com/questions/35841241/   -  person Peeter Kokk    schedule 12.07.2016


Ответы (4)


ОБНОВЛЕНИЕ: за последние годы многое изменилось. Пожалуйста, обратитесь к ответу @Frederik Wendt за хорошим и актуальным решением.

Мой старый ответ: То, как именно это сделать, немного зависит от того, какое изображение вы используете для своего контейнера только для данных. Если у вашего изображения есть entrypoint, вам нужно перезаписать его в файле docker-compose.yml. Например, это решение для официального образа MySql из докер-хаба:

DatabaseData:
  image: mysql:5.6.25
  entrypoint: /bin/bash

DatabaseServer:
  image: mysql:5.6.25
  volumes_from:
    - DatabaseData
  environment:
    MYSQL_ROOT_PASSWORD: blabla

Когда вы выполните docker-compose up для этого, вы получите контейнер, подобный ..._DatabaseData_1, который показывает состояние Exited при вызове docker ps -a. Дальнейшее исследование с docker inspect покажет, что у него временная метка 0. Это означает, что контейнер никогда не запускался. Как указано владельцем докера, напишите здесь.

Теперь, пока вы не сделаете docker-compose rm -v, ваш контейнер только для данных (..._DatabaseData_1) не потеряет свои данные. Так что вы можете делать docker-compose stop и docker-compose up так часто, как захотите.

Если вы хотите использовать специальное изображение только для данных, такое как tianon/true, это работает так же. Здесь вам не нужно перезаписывать entrypoint, потому что его не существует. Похоже, что есть некоторые проблемы с этим изображением и созданием докера. Я не пробовал, но эту статью стоит прочитать, если у вас возникнут какие-либо проблемы.

В целом представляется хорошей идеей использовать то же изображение для вашего контейнера только для данных, которое вы используете для доступа к контейнеру. Дополнительные сведения см. в разделе безумие контейнеров только для данных.

person Jan Suchotzki    schedule 02.10.2015
comment
Я не понимаю. Том — это каталог в файловой системе хоста, который отображается в контейнер, верно? Где здесь объем? - person CrabMan; 21.12.2015
comment
@crabman образ MySQL имеет указанный том. volumes_from указывает Docker вместо этого сопоставить этот том с контейнером DatabaseData. - person JayChase; 26.01.2016
comment
@CrabMa, загляните внутрь контейнера с параметром volumes_from (в вашем случае контейнер Mysql) / запустите # docker mysql_container, проверьте и посмотрите блок Mounts [{Источник: }]. источник это ваш путь на хосте к данным контейнера - person yuklia; 09.05.2016
comment
Эта информация довольно устарела. - person Fredrik Wendt; 23.05.2021

Контейнер только для данных (DOC) — это контейнер, созданный только для использования в качестве поставщика томов. Сам контейнер не имеет никакой функции, кроме того, что другие контейнеры могут монтировать его том с помощью директивы volumes_from.

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

Вопрос ОП: docker-compose.yml запускает DOC каждый раз, когда вы делаете docker-compose up. OP запрашивает возможность только создать контейнер и том, а не запускать его, используя какую-то опцию create_only: true.

person Rob van Laarhoven    schedule 02.10.2015

Другие ответы на этот вопрос устарели, и объемы данных поддерживаются уже некоторое время. Пример:

version: "3.9"
services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:

См. https://docs.docker.com/storage/volumes/#use-a-volume-with-docker-compose, чтобы узнать подробности и варианты.

person Fredrik Wendt    schedule 05.05.2021
comment
Хорошее обновление. Проголосовал. - person VonC; 05.05.2021

Как упоминалось в вопросе из вопроса ОП:

  • вы либо создаете контейнер данных с тем же именем, что и указанный в docker-compose.yml, и запускаете docker-compose up --no-recreate (тот, который указан в docker-compose.yml, не будет воссоздан).
  • или вы запускаете контейнер с помощью простой команды, которая никогда не возвращается.
    Например: tail -f /dev/null
person VonC    schedule 02.10.2015