启动docker compose应用程序时,它会在第一次创建命名卷,然后在每次启动时创建其他卷。这是正常行为,因为它创建了增量卷,还是我的docker-compose文件损坏了?另外,在运行docker volume prune之后,它删除了两个未命名的卷。

两次启动后,输出如下:

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


请参阅我的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:


重现步骤

docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down


评论

请添加“重现步骤”段落,该段落指示发出了哪些命令以及发出的命令顺序。

docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down && docker-compose up -d && docker-compose down

#1 楼

研究表明,匿名卷是由influxdbgrafana/grafana创建的。


首次将匿名卷装入容器时,不会为其提供明确的名称
,因此Docker为它们提供了一个随机名称,该名称可以保证是唯一的在给定的Docker主机中除了名称之外,
命名卷和匿名卷的行为也相同。


结果

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:


导致:

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


,并且每次运行docker-compose down和子序列up时,匿名卷的数量都会增加一倍。

如果将nginx提取,将会发生什么情况而不是influxdb和grafana?

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data


docker-compose down && docker-compose up -d之后吗?

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data


它看起来像是某些图像创建了其他匿名卷。让我们用nginx代替influxdb并使用grafana。

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


每次再次运行docker compose时,grafana/grafana docker镜像都会创建三个匿名卷。让我们用nginx替换influxdb并将grafana还原为nginx:

DRIVER              VOLUME NAME
local               devopsstackexchange_grafana-data
local               devopsstackexchange_influxdb-data


如果重新启动,它仍然是两个。

看起来grafana是导致问题的原因。
为什么每次重新启动grafana / grafana时都会创建三个新的匿名卷?

grafana / grafana dockerfile指示将创建三个匿名卷:


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


该Dockerfile生成一个映像,该映像导致docker运行,在/ myvol创建一个新的安装点,并将问候文件复制到新创建的
卷中在三个匿名卷中的两个中检查返回的路径时,docker volume inspect <volume name, e.g. 34cfafd4603dbc7e71a83e2520f978c8307b084143b3192de65a1995dc1d2f86>返回grafana数据:

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




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


#2 楼

使用Dockerfile指令检查在VOLUME中定义的卷。

如果您不希望自动创建带有随机名称的卷,则可以提供一个主机路径,以将其绑定安装到该卷,检查-v--mount选项,https://docs.docker.com/engine/admin/volumes/volumes/#choose-the--v-or-mount-flag

例如:

-v /srv/lib/grafana:/var/lib/grafana


#3 楼

如果还有其他人要去这个兔子洞。确保您没有在=中用Dockerfile意外定义音量

错误:

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


正确:

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


我花了很长时间来研究为什么docker-compose添加了匿名卷