Por que os volumes não nomeados são criados quando o `docker-compose up` é executado e eles duplicam após emitir o` docker-compose down && docker-compose up`?

8

Ao iniciar um aplicativo de composição do docker, ele cria um volume nomeado na primeira vez e, em seguida, volumes adicionais cada vez que é iniciado. Esse é o comportamento normal em que ele cria volumes incrementais ou meu arquivo de composição de encaixe está quebrado? Além disso, após a execução docker volume prune, ele removeu dois dos volumes não nomeados

Esta é a saída após iniciá-lo duas vezes:

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

E para referência, meu arquivo 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:

Passos para reproduzir

docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down
Moritz
fonte
Adicione um parágrafo 'etapas para reproduzir' que indique quais comandos e em que ordem eles foram emitidos.
030
docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down
Moritz

Respostas:

6

A pesquisa indicou que os volumes anônimos foram criados por influxdbe grafana/grafana.

Os volumes anônimos não recebem um nome explícito quando são montados pela primeira vez em um contêiner; portanto, o Docker fornece um nome aleatório que é garantido como exclusivo em um determinado host do Docker. Além do nome, volumes nomeados e anônimos se comportam da mesma maneira.

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:

resulta em:

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

e sempre que docker-compose down subseqüência upé executada, o número de volumes anônimos dobra.

O que acontecerá se o nginx for extraído em vez do influxdb e grafana?

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data

e depois docker-compose down && docker-compose up -d ?

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data

Parece que certas imagens criaram os volumes anônimos adicionais. Vamos substituir o influxdb pelo nginx e usar grafana.

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

Sempre que a composição do docker foi executada novamente, três volumes anônimos foram criados pelo grafana/grafana imagem docker. Vamos substituir o influxdb pelo nginx e reverter o grafana para o nginx:

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data

e permanece dois se reiniciado.

Parece que a grafana está causando o problema.

Por que três novos volumes anônimos são criados sempre que o grafana / grafana é reiniciado?

O arquivo de encaixe grafana / grafana indica que três volumes anônimos serão criados:

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

Esse arquivo do Docker resulta em uma imagem que causa a execução do docker, para criar um novo ponto de montagem em / myvol e copiar o arquivo de saudação no volume recém-criado.

docker volume inspect <volume name, e.g. 34cfafd4603dbc7e71a83e2520f978c8307b084143b3192de65a1995dc1d2f86> retornou dados grafana quando o caminho retornado foi verificado em dois dos três volumes anônimos:

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

e

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

Se mais alguém estiver descendo por essa toca de coelho. Certifique-se de que você não acidentalmente definir o seu volume com um =na suaDockerfile

Errado:

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

Corrigir:

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

Levei muito tempo para descobrir por que os volumes anônimos estavam sendo adicionados por docker-compose

Scott
fonte