Этот вопрос связан с проблемой в репозитории Docker:
https://github.com/docker/compose/issues/942
Я не могу понять, как создать контейнер данных (процесс не запущен) с помощью docker compose.
Этот вопрос связан с проблемой в репозитории Docker:
https://github.com/docker/compose/issues/942
Я не могу понять, как создать контейнер данных (процесс не запущен) с помощью docker compose.
ОБНОВЛЕНИЕ: за последние годы многое изменилось. Пожалуйста, обратитесь к ответу @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
, потому что его не существует. Похоже, что есть некоторые проблемы с этим изображением и созданием докера. Я не пробовал, но эту статью стоит прочитать, если у вас возникнут какие-либо проблемы.
В целом представляется хорошей идеей использовать то же изображение для вашего контейнера только для данных, которое вы используете для доступа к контейнеру. Дополнительные сведения см. в разделе безумие контейнеров только для данных.
Контейнер только для данных (DOC) — это контейнер, созданный только для использования в качестве поставщика томов. Сам контейнер не имеет никакой функции, кроме того, что другие контейнеры могут монтировать его том с помощью директивы volumes_from
.
DOC нужно запустить только один раз, чтобы создать том. Другие контейнеры могут ссылаться на его тома, даже если он остановлен.
Вопрос ОП: docker-compose.yml
запускает DOC каждый раз, когда вы делаете docker-compose up
. OP запрашивает возможность только создать контейнер и том, а не запускать его, используя какую-то опцию create_only: true
.
Другие ответы на этот вопрос устарели, и объемы данных поддерживаются уже некоторое время. Пример:
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, чтобы узнать подробности и варианты.
Как упоминалось в вопросе из вопроса ОП:
docker-compose.yml
, и запускаете docker-compose up --no-recreate
(тот, который указан в docker-compose.yml
, не будет воссоздан).tail -f /dev/null