nicosommi

software engineer

posts

slides

about

Contenedores unicamente de volumenes en docker (volume only containers)

September 07, 2016
2 min read

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.

nico
Copyright by nicosommi 🥑