服务“redis”指的是未定义的卷redis-dev:无效的组成项目

tzcvj98z  于 2023-11-16  发布在  Redis
关注(0)|答案(2)|浏览(236)

这是我的docker compose文件,其中我动态声明了redis服务和卷

redis:
  container_name: redis-${ENV}
  image: redis
  command: --port ${REDIS_PORT}
  ports:
    - "${REDIS_PORT}:6379"
  volumes:
    - redis-${ENV}:/data
  networks:
    - app

volumes:
  redis:
    name: redis-${ENV}
    external: false

字符串
我得到错误:service "redis" refers to undefined volume redis-dev: invalid compose project

2lpgd968

2lpgd9681#

一旦我让你的docker-compose.yml工作,通过删除未定义的app网络,这是不相关的,并添加缺失的services部分:

services:
  redis:
    container_name: redis-${ENV}
    image: redis
    command: --port ${REDIS_PORT}
    ports:
      - "${REDIS_PORT}:6379"
    volumes:
      - redis-${ENV}:/data

volumes:
  redis:
    name: redis-${ENV}
    external: false

字符串
我得到了和你一样的输出:

$ docker-compose config
service "redis" refers to undefined volume redis-env: invalid compose project


我认为问题是你假设你可以通过它的name属性的值来引用这个卷。这只是一个标签,但它的标识符仍然是redis,不能用环境变量插值(没有键,只有值)。
换句话说,我不认为你想做的事情可以完成,至少不只是在docker-compose.yml文件中。你可以通过在外部创建卷,然后将其用作外部卷来实现这一点。

0dxa2lsx

0dxa2lsx2#

这两个名字必须匹配:

services:
  redis:
  volumes:
    - redis-${ENV}:/data
    # ^^^^^^^^^^^^

volumes:
  redis:
# ^^^^^

字符串
请注意,Compose能够自己构造卷和容器名称。它使用项目名称作为名称的一部分,因此生成的名称最终看起来与您指定的名称非常相似,只要您使用docker-compose -p dev选项或类似选项。您可以在整个文件中删除手动名称设置和${ENV}的提及。
如果您还让每个Redis示例在其容器内使用其标准端口6379(容器网络隔离意味着不会有冲突)并使用Compose-provided default网络,则可以将其减少到

version: '3.8'
services:
  redis:
    image: redis
    ports:
      - "${REDIS_PORT:-6379}:6379"
    volumes:
      - redis:/data

volumes:
  redis:

相关问题