Contenedores unicamente de volumenes en docker (volume only containers)
En estos dias estuve trabajando mucho con Docker para diversos proyectos, aprendiendo mucho en el camino, y note que hay un tema particular que me costo digerir.
Los volumenes compartidos entre containers que necesitan permanecer en una ubicacion determinada del host son soportados de una manera extraña que se da casi por casualidad.
Es decir, si quiero que mi container bindee una carpeta a una carpeta del host, esto es muy sencillo si quiero hacerlo para un solo container, basta con un argumento a docker run, como el siguiente
docker run -it -v /etc:/etc coreos/apache /bin/bash
Pero que tal si quiero que esto suceda en varios servicios y a su vez utilizando docker-compose?
Bueno esto tampoco es dificil, por ejemplo algo asi
version: '2' services: webserver: image: coreos/apache volumes: - /etc:/etc app2: build: . volumes: - /etc:/etc
Podriamos utilizar los ‘named’ volumes a nivel service para compartirlos, pero en ese caso no estariamos especificando el volume del host.
Ahora bien, si este patron de mapeo de volumenes lo utilizamos varias veces, uno tiende a reutilizar el codigo, y aqui es donde he encontrado este patron muy utilizado que queria señalar:
version: '2' services: data: image: tianon/true volumes: - /etc:/etc webserver: image: coreos/apache volumes_from: - data app2: build: . volumes_from: - data app3: image: postgres volumes_from: - data
Bueno aqui ven el patron al que me refiero. Es extraño porque hay incluso imagenes en docker hub que son “fake” solo para generar esto (como la indicada, tianon/true). Si bien la idea del comando es realmente tomar los volumenes de otro container, esto lo he visto muchisimo, y es usado porque de esta manera queda mas significativo el mapeo que tomandolo de un container X particularmente (es decir queda mas claro al tomar volumes from ‘data’ que tomarlos de ‘webserver’) y bueno porque de docker te dicen que lo hagas asi.
Creo que vale la pena señalarlo ya que me costo mucho entender que en la version 2 del docker compose esto no tiene nada que ver con los volumenes (que estan pensados para compartir volumenes entre containers) y buscando en internet no suelen encontrarse tan facilmente desde este punto de vista, sino que uno tiene que “deducir” que esta es la “mejor” forma de utilizarlo, y entonces buscarlo de esta manera (volume only container o data volume container), porque en realidad esto si esta documentado aqui y es uno de los pocos casos de uso que no cubre el nuevo volumes (segun este issue).
Como conclusion final vale la pena entonces destacar que en la version 2 del docker compose esto sigue utilizandose de la misma manera que la primer version, mas alla de la adicion de los volumes al YAML.