¿Por qué se crean volúmenes sin nombre cuando se ejecuta 'docker-compose up' y se duplican después de emitir 'docker-compose down && docker-compose up'?

8

Al iniciar una aplicación de composición de Docker, crea un volumen con nombre la primera vez y luego volúmenes adicionales cada vez que se inicia. ¿Es este el comportamiento normal en el sentido de que crea volúmenes incrementales o mi archivo de compilación acoplable está roto? Además, después de ejecutar docker volume prune, eliminó dos de los volúmenes sin nombre

Este es el resultado después de iniciarlo dos veces:

DRIVER              VOLUME NAME
local               2b33c81e6e955ff36061f4120b7181c7efc7aebded2f87eaa7290027f1e7a725
local               74301eadc75018d6f7da76aec44bcf743e03261492cfcc33211941684a570030
local               c42b1e2c17342c52b4b9e90f4d4b7fa24ccb30de5479e65cf4366e2373dfb0bf
local               dcfa63dbf99362fc92fe3b981f50abebfe1bba03063d4dd9dd790f4c058817cf
local               dockerinfluxdbgrafana_grafana-data
local               dockerinfluxdbgrafana_influxdb-data

Y para referencia mi archivo docker-compose

version: "3"
services:
  influxdb:
    image: influxdb:latest
    container_name: influxdb
    ports:
      - "8086:8086"
    env_file:
      - 'env.influxdb'
    networks:
      - backend
    volumes:
      - influxdb-data:/var/lib/influxdb

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    env_file:
      - 'env.grafana'
      - 'secrets.grafana'
    networks:
      - backend
    volumes:
      - grafana-data:/var/lib/grafana

networks:
  backend:

volumes:
  influxdb-data:
  grafana-data:

pasos para reproducir

docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down
Moritz
fuente
Agregue un párrafo de "pasos para reproducir" que indique qué comandos y en qué orden se emitieron.
030
docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down
Moritz

Respuestas:

6

La investigación indicó que los volúmenes anónimos fueron creados por influxdby grafana/grafana.

Los volúmenes anónimos no reciben un nombre explícito cuando se montan por primera vez en un contenedor, por lo que Docker les da un nombre aleatorio que se garantiza que será único dentro de un host Docker dado. Además del nombre, los volúmenes con nombre y anónimos se comportan de la misma manera.

Resultados

version: "3"
services:
  influxdb:
    image: influxdb:latest
    container_name: influxdb
    ports:
      - "8086:8086"
    #env_file:
    #  - 'env.influxdb'
    networks:
      - backend
    volumes:
      - influxdb-data:/var/lib/influxdb

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    #env_file:
    #  - 'env.grafana'
    #  - 'secrets.grafana'
    networks:
      - backend
    volumes:
      - grafana-data:/var/lib/grafana

networks:
  backend:

volumes:
  influxdb-data:
  grafana-data:

resultados en:

DRIVER              VOLUME NAME
local               604a07040367512b09c618c6dcc71a7f55390c9c23de6ab08be7466414ed62da
local               7f4b630073b31b6e772d3edef6da81b48643525edfc34281ea13fbd6b86ec270
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data

y cada vez que se ejecuta docker-compose downy posteriormente upse duplica el número de volúmenes anónimos.

¿Qué sucederá si se extrae nginx en lugar de influxdb y grafana?

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data

y despues docker-compose down && docker-compose up -d?

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data

Parece que ciertas imágenes crearon los volúmenes anónimos adicionales. Reemplacemos influxdb con nginx y usemos grafana.

DRIVER              VOLUME NAME
local               15b80416ab06abb629d9f634a0feff08f7c560f31d614b9b430855c16cdb75c7
local               205a6f19cbf992c95b2e3be9f2fb1ca9ecec35fce550d0b7a4b9f32b0ef163b1
local               474108f5b7b14fba92a3e5a980f3bf851388b2ee25d7417df5c42d9f176e084b
local               5830a31a470ec8a42ddae7a37bb50487f3f36360318b2f9f5301b338507782b4
local               9f00868a2fec0cfc0d34dc12d0879d39487a13128863722f400ad4c47df2d340
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data
local               f47b1b7bbec8e50b32a7c39704c7c218165b284298d852313fa24bc7cbe6acc5

Cada vez que se ejecuta Docker compose nuevamente, la grafana/grafanaimagen de Docker crea tres volúmenes anónimos . Reemplacemos influxdb con nginx y revertamos el grafana a nginx:

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data

y sigue siendo dos si se reinicia.

Parece que la grafana está causando el problema.

¿Por qué se crean tres nuevos volúmenes anónimos cada vez que se reinicia grafana / grafana?

El archivo grafana / grafana dockerfile indica que se crearán tres volúmenes anónimos:

VOLUME ["/var/lib/grafana", "/var/log/grafana", "/etc/grafana"]

https://docs.docker.com/engine/reference/builder/#volume

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

Este Dockerfile da como resultado una imagen que hace que Docker se ejecute, para crear un nuevo punto de montaje en / myvol y copiar el archivo de saludo en el volumen recién creado.

docker volume inspect <volume name, e.g. 34cfafd4603dbc7e71a83e2520f978c8307b084143b3192de65a1995dc1d2f86> datos grafana devueltos cuando la ruta que se devolvió se verificó en dos de los tres volúmenes anónimos:

sudo ls /var/lib/docker/volumes/a0ecd00df8fc68ef36e777c7bf9ec5a496ee30e313b86889487501a53fa2e28e/_data
grafana.ini  ldap.toml

y

sudo ls /var/lib/docker/volumes/34cfafd4603dbc7e71a83e2520f978c8307b084143b3192de65a1995dc1d2f86/_data
grafana.db  plugins
030
fuente
0

Si alguien más va por este agujero de conejo. Asegúrese de que usted no ha definido su volumen de forma accidental con una =en suDockerfile

Incorrecto:

VOLUME = ["/logs", "/data"]

Correcto:

VOLUME ["/logs", "/data"]

Me llevó mucho tiempo investigar por qué los volúmenes anónimos fueron agregados por docker-compose

Scott
fuente