Docker Compose部署报错:no such service: database问题排查
Docker Compose部署报错“no such service: database”排查与解决
你的docker-compose.yml配置如下:
version: '3.9' services: db: image: mongo restart: always volumes: - 'dbdata:/data/db' container_name: database server: build: . restart: always ports: - '2000:2000' depends_on: - db container_name: api links: - database frontend: build: ./client restart: always ports: - '3000:3000' depends_on: - server container_name: client links: - api volumes: dbdata:
本地执行docker compose up -d正常,但在Oracle Linux 8.6上执行时创建网络后报错“no such service: database”,核心原因是**links字段的使用错误**,和系统/版本的兼容性也有一定关联:
问题根源
Docker Compose的links字段要求引用的是服务名称(即services下的键名,比如db、server),而非容器的container_name。你的配置中:
server服务的links写了database(这是db服务的容器名),而非服务名dbfrontend服务的links写了api(这是server服务的容器名),而非服务名server
本地能正常运行,大概率是因为本地Docker/Compose版本对这种错误的兼容性更宽松;而Oracle Linux上的版本规则更严格,直接触发了错误。
修复方案
方案1:修正links字段为服务名
修改后的配置如下:
version: '3.9' services: db: image: mongo restart: always volumes: - 'dbdata:/data/db' container_name: database server: build: . restart: always ports: - '2000:2000' depends_on: - db container_name: api links: - db # 改为服务名db frontend: build: ./client restart: always ports: - '3000:3000' depends_on: - server container_name: client links: - server # 改为服务名server volumes: dbdata:
方案2:直接删除links字段(推荐)
现代Docker Compose中,同一项目的服务会自动加入默认网络,直接通过服务名即可互相访问(比如server服务内访问db服务,直接用db作为主机名),links字段已经属于过时用法,完全可以删除,不影响服务间通信。
额外建议
检查Oracle Linux上的Docker和Docker Compose版本,确保为稳定版:
# 查看Docker版本 docker --version # 查看Docker Compose版本 docker compose version
如果版本过旧,建议升级到官方推荐的稳定版本,避免更多兼容性问题。
内容的提问来源于stack exchange,提问作者Nicolas Fredsny
相关产品推荐
相关产品推荐

