Docker Compose中使用depends_on条件导致express容器无法启动
问题描述
运行docker-compose up后,db-admin、redis、database容器可正常启动,但express容器未启动;手动在Docker Desktop中启动该express容器却能正常运行。
我的docker-compose配置
version: '3.8' services: redis: image: redis:alpine ports: - 6379:6379 express: image: node:lts-alpine container_name: nodejs build: context: / command: npm run dev restart: always environment: NODE_ENV: development ports: - 3000:3000 volumes: - ./:/src depends_on: database: condition: service_completed_successfully redis: condition: service_completed_successfully database: image: postgres:15-alpine restart: always environment: POSTGRES_PASSWORD: password POSTGRES_USER: admin POSTGRES_DB: *** ports: - 5432:5432 db-admin: image: dpage/pgadmin4 environment: PGADMIN_DEFAULT_EMAIL: admin@example.com PGADMIN_DEFAULT_PASSWORD: password ports: - 8081:80 volumes: - ./pgadmin/servers.json:/pgadmin4/servers.json
排查与解决步骤
1. 修正depends_on的条件配置
你的express服务依赖配置使用了service_completed_successfully,但redis、postgres都是长期运行的服务,不会进入"运行完成退出"的状态,导致express一直等待依赖完成,无法启动。
解决方式:
将依赖条件改为service_healthy,同时给redis和database添加健康检查,确保服务就绪后再启动express:
# 修改redis服务配置,添加健康检查 redis: image: redis:alpine ports: - 6379:6379 healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 # 修改database服务配置,添加健康检查 database: image: postgres:15-alpine restart: always environment: POSTGRES_PASSWORD: password POSTGRES_USER: admin POSTGRES_DB: *** ports: - 5432:5432 healthcheck: test: ["CMD-SHELL", "pg_isready -U admin -d ***"] interval: 5s timeout: 3s retries: 5 # 修改express的depends_on配置 express: # ... 其他配置 depends_on: database: condition: service_healthy redis: condition: service_healthy
2. 检查build.context配置错误
express服务的build.context设为/,会尝试从系统根目录构建镜像,大概率缺少Dockerfile或构建失败,导致容器无法启动;而手动启动时可能复用了已存在的镜像,所以能正常运行。
解决方式:
如果Dockerfile和docker-compose.yml在同一目录,将build.context改为.;如果不需要构建镜像(直接用node镜像运行),可以移除build字段:
express: image: node:lts-alpine container_name: nodejs build: context: . # 修改为当前目录 # ... 其他配置
3. 处理启动命令依赖问题
command: npm run dev可能因容器内未安装依赖(无node_modules)执行失败,手动启动时可能本地已挂载依赖或之前安装过,所以能运行。
解决方式:
在启动命令前先执行依赖安装:
express: # ... 其他配置 command: sh -c "npm install && npm run dev"
4. 查看容器日志定位具体问题
执行以下命令查看express容器的启动日志,获取精准错误信息:
docker-compose logs express
或直接在Docker Desktop中查看该容器的日志,根据提示进一步排查。
内容的提问来源于stack exchange,提问作者Amon
相关产品推荐
相关产品推荐

