You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中Sqlite3只读无法创建写入,如何设置可写权限?

问题根因

无法创建SQLite数据库文件的核心原因是:你仅修改了db.sqlite单个文件的所有者,但/usr/src/app目录的所有者默认是root用户,切换到普通用户docker后,对该目录没有写入权限,删除原有db文件后自然无法新建数据库文件。除此之外你的Dockerfile还存在多处语法和逻辑错误。

修正后的Dockerfile
FROM ubuntu:latest
# 提前更新源并安装依赖,root用户下无需加sudo
RUN apt-get -y update && apt-get install -y \
    sudo \
    sqlite3 \
    python3 \
    python3-pip
# 创建工作目录
WORKDIR /usr/src/app
# 先复制依赖文件单独安装,利用Docker分层缓存
COPY requirements.txt .
RUN pip3 install -r requirements.txt --no-cache-dir
# 新建普通用户
RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo
# 给整个工作目录设置docker用户的所有权,保证完整读写权限
RUN chown -R docker:docker /usr/src/app
# 切换到普通用户
USER docker
# 复制所有项目文件,指定所有者避免权限冲突
COPY --chown=docker:docker . .
# 设置环境变量
ENV PATH="/home/docker/.local/bin:${PATH}"
ENV FLASK_APP=__init__.py
ENV FLASK_DEBUG=1
ENV FLASK_RUN_HOST=0.0.0.0
ENV FLASK_ENV=development 
# 启动命令
CMD ["flask", "run"]
关键修改说明
  • 移除了冗余的sudo调用,安装系统依赖阶段本身就是root用户,不需要额外加sudo
  • 给整个/usr/src/app目录设置docker用户的所有权,不管是修改已有db文件还是新建db文件都能正常执行
  • 修正了指令顺序:先安装依赖再切换用户,避免普通用户安装全局依赖权限不足的问题
  • 修正了Python版本对应问题:统一使用python3和pip3,避免ubuntu默认python2导致的依赖不兼容
  • 移除了多余的CMD /bin/bash指令,Dockerfile中只会生效最后一个CMD指令,冗余指令没有意义
  • 复制项目文件时添加--chown参数,保证复制进来的文件所有者都是docker用户,避免后续权限冲突

如果你是挂载了本地卷到容器的/usr/src/app目录,启动容器时需要额外加上--user "$(id -u):$(id -g)"参数,保证容器内用户和本地目录的所有者UID/GID一致,避免挂载后的权限问题。

内容的提问来源于stack exchange,提问作者Nav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:48:04