Эквивалент volume_from в Docker Compose v3
Здесь есть похожие на вид вопросы ( docker-compose volume_from, эквивалентный версии 3, как заменить volume_from в docker-composer v3), но я не думаю, что они отвечают на вопрос (или, по крайней мере, я не понимаю, как ответы решают проблема). Итак, позвольте мне попробовать еще раз, очень конкретно.
У меня есть этот v2 docker-compose.yml:
version: '2'
services:
full-tests:
volumes:
- ..:/opt/project
- ../../../ext-libs:/opt/ext-libs
- ./third-mapping:/opt/third
unit-tests:
volumes_from: full-tests
Дело в том, что набор томов определяется один раз, и я легко могу использовать их, используя volumes_from
,
Как бы вы переписали это в v3?
3 ответа
Чтобы ответить на ваш вопрос - это невозможно с v3 - см. Раздел ниже. v3 не должен использоваться в качестве преемника (также является официальным заявлением докера), он должен использоваться в "случаях роя".
тем не менее, то, что вы должны сделать, это использовать именованные тома.
Вы можете комбинировать его с томами для подключения к хосту, как это
docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -o o=bind
Вы можете упростить это, используя длинный синтаксис, представленный в 3.2: https://docs.docker.com/compose/compose-file/, чтобы вы могли определить именованный том + связывание на хосте в докере Пример составления файла:
services:
full-tests:
volumes:
- type: volume
source: ../
target: /opt/project
- type: volume
source: ../../../ext-libs
target: /opt/ext-libs
или короче как ты
services:
full-tests:
volumes:
- ../:/opt/project
- ../../../ext-libs:/opt/ext-libs
Но вы не можете этого сделать, поместив длинный синтаксис в определение "тома" верхнего уровня, чтобы дать этому тому имя, и повторно использовать его в разделе томов в сервисах - это невозможно. Для этого вы должны использовать
volumes:
project:
external: true
third-party:
external: true
А затем используйте синтаксис "docker volume create" в cli для создания этих томов с опцией связывания, как показано выше.
но вы никогда не поймете, что объемы_ от вас делали здесь
В v3 нет эквивалента volume_from, поскольку v3 не является преемником v2, его альтернатива - см. Мой комментарий и источники здесь https://github.com/rancher/rancher/issues/3316
Подводя итог, мы можем сказать, что объемы_от и объемы перекрываются в том случае, если просто использовался тот же объем / в неправильном поле.
a) Если вы хотите, чтобы данные сохранялись при обновлении стека (вниз + вверх), вы выбираете именованные тома - и теперь, если 2+ сервисы должны поделиться этим, просто смонтируйте этот именованный том, используя volumes:
,
б) Если вы, темне менее, не хотите, чтобы данные сохранялись при обновлении стека (например, потому что его исходный код и изображение фактически содержат обновления этого), как в обычном сценарии приложения + httpd / proxy, вы создадите anon-volume для этого например /var/www
в Dockerfile, используя Volume /var/www
а затем используйте volume_from, чтобы смонтировать его в httpd
оказание услуг.
основной момент с b состоит в том, что при обновлении стека анонный том будет удален ( `docker-compose down удаляет анонные контейнеры, но не именованные), и, таким образом, обновление работает, как и ожидалось, у вас есть новая кодовая база
Попытка сделать то же самое с именованными томами даст вам большой сюрприз при первом обновлении, так как код находится на именованном томе и будет перекрывать кодовую базу на "новом" изображении / новом контейнере, таким образом, вы будете работать на старом кодовая база после обновления.
Вы можете использовать поля расширения, чтобы сделать код коротким, но это не совсем то же самое, что volumes_from
, Например:
version: '3.7'
x-volumes:
&my-volumes
- ..:/opt/project
- ../../../ext-libs:/opt/ext-libs
- ./third-mapping:/opt/third
services:
full-tests:
volumes:
*my-volumes
unit-tests:
volumes:
*my-volumes
У меня есть докер-композитор версии 3, работающий с унисон. В основном пришлось заменить "volume_from" и создать глобальную декларацию "volume".
version: "3"
services:
unison:
container_name: xxx_unison
image: onnimonni/unison
environment:
- UNISON_DIR=/var/www/$DOCKER_WEB_DOMAIN/htdocs/
- UNISON_USER=www-data
- UNISON_UID=1000
- UNISON_GID=1001
volumes:
- unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/
networks:
- frontend
ports:
- "5000:5000"
database:
container_name: xxx_database
image: percona
depends_on:
- unison
environment:
- MYSQL_ROOT_PASSWORD=xxx
- MYSQL_DATABASE=xxx # Assign a database to be created on container first load
volumes:
- ./mysql/import:/docker-entrypoint-initdb.d
- ./mysql/data/:/var/lib/mysql/
- ./logs:/var/log/mysql
- ./mysql/conf:/etc/mysql/conf.d
ports:
- "3306:3306"
networks:
- frontend
web:
container_name: xxx_web
image: ubuntu
depends_on:
- unison
volumes:
- ./nginx/ssl/:/etc/nginx/ssl/
- ./logs/:/var/log/nginx
- ./shell/run.sh:/run.sh
- unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/
ports:
- "80:80"
- "443:443"
networks:
- frontend
env_file:
- ./.env
networks:
frontend:
volumes:
unison_file: