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
相关产品推荐
相关产品推荐

