Con Docker Compose v1.6.0 +, ahora hay una nueva sintaxis de archivo / versión 2 para el docker-compose.yml
archivo. Los cambios incluyen una clave de nivel superior separada llamada volumes
. Esto permite "centralizar" las definiciones de volumen en un solo lugar.
Lo que estoy tratando de hacer es nombrar volúmenes allí y tener una ruta múltiple de referencia de volumen único en mi disco host local. El siguiente es un ejemplo, arrojando una excepción con un Traceback
que termina con
AttributeError: 'list' object has no attribute 'items'
Ejemplo docker-compose.yml
:
version: '2'
services:
db:
image: postgres
volumes:
- database:/var/lib/postgres/data
php:
image: php-fpm:5.6
volumes:
- phpconf:/etc/php/conf.d
namedvolume:
container_name: namedvolume
build: ./Docker/Testvolume
volumes:
- ./Docker/Testvolume/shareme
volumes:
database:
- ./Docker/Postgres/db:ro
- ./Docker/Postgres/ini
phpconf:
- ./Docker/PHP-FPM/conf
singledir: ./Docker/foo
completemap: ./Docker/bar:/etc/service/conf.d
- namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
… ?
Hasta ahora, leí toda la referencia de configuración de Docker Compose docs master
-branch Volume, Docker Compose docs Volume / Volume-Driver reference y busqué en los ejemplos de GitHub para encontrar la sintaxis correcta que se espera. Parece que nadie ya está usando eso (GitHub) y la documentación está lejos de estar completa (docker.com). También intenté construir un volumen separado service
y hacer referencia a él volumes
, pero eso tampoco funciona. ¿Alguna idea de cómo se supone que debe ser esta sintaxis?
fuente
$(docker volume ls |awk '{print $2}')
que pueda usar$(docker volume ls -q)
No solo es esto más simple, no imprime "VOLUMEN" en la primera línea.volumes_from
es heredar la lista de volúmenes de otro contenedor. Para usar un volumen con nombre, usa la sintaxis de nivel de servicio- NAME:DEST
y establece la ruta en lavolumes
clave de nivel superior . Lo que hace este ejemplo (al momento de escribir esto) es hacer un volumen estándar además de un volumen con nombre, y el volumen con nombre simplemente no se usa.Según tengo entendido, puede usar la
volumes:
sección global paraLos volúmenes en la sección global se crearán automáticamente a menos que usted especifique
external: true
. Aún tendrá que decirle a cada servicio en suvolumes:
sección dónde montar ese volumen.Aquí hay un ejemplo muy simple:
La
volumes:
entrada global paraproject
haráproject
que se cree un volumen con nombre . Luego se monta como/bar
en el servicio uno y como/foo
en el servicio dos. Ambos servicios comparten los datos del volumen y pueden leerlo / escribirlo.No creo que lo que intentas hacer sea posible (convertir múltiples rutas en un solo volumen y con diferentes r / w flags). Si es posible, entonces probablemente encontrando una manera de crear un volumen con nombre con estas propiedades a través de otros medios y luego agregándolo como un volumen externo:
fuente
project
y luego hacer referencia a élproject:/bar
, ¿dónde estánproject
realmente definidas las rutas?project:
alias? ¿Cómo sabe Docker si quiero compartir, digamos./some_folder/some_subfolder/yet_another_subfolder
a los contenedoresone:
ytwo:
?Consulte la Versión 2, por ejemplo, también la referencia de configuración de Volumen :
Mi ejemplo: (Versión 1)
fuente
Version 2
sección del documento)volumes
tecla de nivel superior por separado , lo cual no hice, de ahí la pregunta. Lo que no entiendo es lo que ladocker-compose.yml
parte con la sintaxis de la versión 1 está destinada a explicarme.Creo que lo que intentas hacer es más o menos lo mismo que se ve aquí . En resumen: actualmente no es posible crear un volumen con nombre que se refiera a un punto de montaje en el host. Puede crear un volumen con nombre para compartir datos entre contenedores, pero los datos solo existirán en el volumen mismo y desaparecerán cuando elimine el volumen.
Se ha propuesto el montaje de volúmenes con nombre , pero desafortunadamente no se agregará al núcleo en un futuro próximo. Sin embargo, es posible mediante el uso de un complemento docker llamado local-persist .
fuente