Sqlite3 数据库在 Docker 容器中保持只读且不可创建。如何让它可写?

Sqlite3 database remains read-only and un-creatable in a Docker container. How to make it writeable?

我已经看到相关问题了。 None 这些解决方案有效。这是我的 docker 文件。我正在使用 Flask 和 SQLAlchemy 写入与 Flask 应用程序位于同一文件夹中的数据库。

FROM ubuntu:latest
RUN apt-get -y update && apt-get -y install sudo
RUN sudo apt-get install -y sqlite3
RUN sudo apt-get install -y python
RUN sudo apt-get install -y python3-pip
WORKDIR /usr/src/app
COPY . .
#RUN sudo chmod 777 /usr/src/app/db.sqlite
#RUN chmod a+rw /usr/src/app/db.sqlite
#RUN useradd -m docker && sudo usermod -u 1200 www-data && sudo usermod -G docker www-data
#RUN chown www-data:www-data /usr/src/app/db.sqlite
RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo
RUN sudo chown docker /usr/src/app/db.sqlite
USER docker
CMD /bin/bash

RUN pip install -r requirements.txt
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"]  

被注释掉的行,显示我已经尝试失败的命令。
所以我使用 docker exec -it <container_id> bash 登录容器并尝试直接更改权限和所有权,但仍然没有用。
然后我删除了 db.sqlite 文件并尝试使用 sqlite3 db.sqlite 创建一个文件。但是数据库甚至不会被创建:

docker@5aeeb3039ef1:/usr/src/app$ sqlite3 db.sqlite
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .tables
Error: unable to open database "db.sqlite": unable to open database file

正在您的系统上进行测试:
有人可以帮忙吗?为了测试它,你可以创建上面的 Dockerfile 并在同一目录中创建一个数据库,你只需要在你的系统上安装 sqlite3 并使用 sqlite3 db.sqlite 创建数据库。要创建 table,您可以使用 CREATE TABLE user (id INTEGER NOT NULL, username VARCHAR(10), password VARCHAR(20), name VARCHAR(100), PRIMARY KEY (id), UNIQUE (email));.

ps:我最终 这个复杂的 Dockerfile 因为 sqlite3 不会安装在一个简单的 python 预装了 Flask 的镜像中。

解决了。事实证明,不需要切换到 USER docker

FROM ubuntu:latest
RUN apt-get -y update
RUN apt-get install -y sqlite3 python python3-pip 
WORKDIR /usr/src/app
COPY . .
RUN pip install -r requirements.txt
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"]