Azure上Docker Compose多容器启动失败排查求助
问题诊断与解决方案
核心问题1:sqlite:latest镜像不存在
Docker Hub上没有官方维护的SQLite镜像,你指定的sqlite:latest是无效的,这直接导致拉取镜像时返回NotFound错误,和私有仓库凭证无关。SQLite是嵌入式文件型数据库,不需要单独运行容器——它的运行依赖宿主进程(你的Flask应用),单独启动SQLite容器没有任何实际作用。
核心问题2:Web容器缺少启动命令
你的Dockerfile没有定义CMD或ENTRYPOINT指令,导致Web容器启动后没有前台进程,会立刻退出,这也是部署失败的隐性原因。
核心问题3:数据库路径与卷挂载不匹配
当前docker-compose.yml中,db服务的卷挂载到/app/db,但你的Flask应用在/ddm/db/core/core.db路径读取数据库,路径完全不对应,即使db容器能启动,Web应用也无法访问数据库文件。
修正方案
1. 移除无用的db服务,调整持久化配置
修改docker-compose.yml,删除单独的db服务,将持久化卷直接挂载到Web容器的数据库目录:
services: web: image: ankwilitas/ddm:003 ports: - "5000:5000" volumes: - db_data:/ddm/db/core # 与app.py中的数据库路径对应 volumes: db_data:
2. 给Web容器添加启动命令
在你的Dockerfile末尾添加启动Flask应用的指令,确保容器启动后保持运行:
# 原有内容... # 添加启动命令 CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
注意:如果你的requirements.txt里安装了gunicorn,也可以用更稳定的生产级启动命令:
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
3. 验证数据库初始化逻辑
确保你的应用在首次启动时能自动创建core.db和service_messages表(如果不存在),否则会出现数据库文件不存在的错误。可以在app.py中添加初始化逻辑:
from flask import Flask, render_template import sqlite3 app = Flask(__name__) app.secret_key = "tbase11" # 数据库初始化逻辑 def init_db(): db = sqlite3.connect("db/core/core.db") cursor = db.cursor() # 创建表(如果不存在) cursor.execute(''' CREATE TABLE IF NOT EXISTS service_messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, welcome_message TEXT NOT NULL ) ''') # 插入默认数据(如果表为空) cursor.execute("SELECT COUNT(*) FROM service_messages") if cursor.fetchone()[0] == 0: cursor.execute("INSERT INTO service_messages (welcome_message) VALUES ('Welcome to the app!')") db.commit() db.close() init_db() @app.route('/') def index(): db = sqlite3.connect("db/core/core.db") cursor = db.cursor() cursor.execute("SELECT welcome_message FROM service_messages") welcome_message = cursor.fetchone()[0] db.close() return render_template('index.html', welcome_message=welcome_message)
4. Azure App Service配置检查
- 确保在部署中心选择了
Docker Compose部署方式,并且上传了修正后的docker-compose.yml - 确认App Service的持久存储已启用,卷
db_data会被映射到Azure的持久存储中,避免容器重启后数据丢失
内容的提问来源于stack exchange,提问作者Patrick Stacey
相关产品推荐
相关产品推荐

