如何配置Docker Compose让ipfs服务启动后再构建web服务?
解决方案:实现ipfs服务就绪后再执行web服务的初始化逻辑
核心问题根源:Docker镜像的构建阶段(即Dockerfile中
RUN指令的执行阶段)独立于Docker Compose的容器启动流程,执行docker compose up时,会先完成所有服务的镜像构建,再按依赖顺序启动容器,因此构建阶段完全访问不到任何Compose管理的服务,depends_on配置也不会作用于构建流程。
解决思路:把需要依赖ipfs服务的逻辑(等待ipfs就绪、单元测试)从镜像构建阶段移到web容器的启动阶段,再配合Compose的健康检查保证ipfs完全就绪后再启动web容器。
1. 新增web服务启动脚本 entrypoint.sh
在项目根目录新建entrypoint.sh,内容如下:
#!/bin/bash set -e # 等待ipfs就绪 python ./wait_ipfs.py # 执行单元测试 python -m unittest # 启动web服务 exec "$@"
2. 修改Dockerfile
移除构建阶段依赖ipfs的指令,调整为启动时执行脚本:
FROM python:3.9 WORKDIR /app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . # 给启动脚本加执行权限 RUN chmod +x entrypoint.sh # 指定启动入口 ENTRYPOINT ["./entrypoint.sh"] CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
3. 修改docker-compose.yml配置
增加ipfs服务的健康检查,调整web服务的依赖条件为等待ipfs健康检查通过:
version: "3.9" services: web: build: . ports: - "5000:5000" environment: - FLASK_APP=app.py - FLASK_ENV=development - IPFS_ADDR=/dns/ipfs/tcp/5001 - PIN_DATA=False depends_on: ipfs: condition: service_healthy ipfs: image: ipfs/go-ipfs:v0.7.0 ports: - "4001:4001" - "5001:5001" - "8080:8080" # 健康检查:验证ipfs服务是否完全启动 healthcheck: test: ["CMD", "ipfs", "diag", "sys"] interval: 5s timeout: 10s retries: 5
内容的提问来源于stack exchange,提问作者João Areias
相关产品推荐
相关产品推荐

