Cha*_*ste 7 python sqlite docker docker-compose docker-volume
我正在使用用作 REST API 的烧瓶服务器(在带有 python 3.5 的 virtualenv 中)(仅用于按照烧瓶的建议进行开发)。一开始,它连接到本地 sqlite 数据库,并会尽快提交任何 db 更改。现在我想在 docker 容器中运行所有东西,我想知道如何访问数据库,因为 sqlite 文件位于容器中。
所以我在 docker-compose 文件中创建了一个卷,它指向构建应用程序的 dockerfile。
Dockerfile:
FROM python:latest
ENV HOME /home/parkrep
WORKDIR $HOME
ADD requirements.txt $HOME/requirements.txt
RUN pip install -r requirements.txt
ADD . $HOME
EXPOSE 80
CMD ["python", "server.py"]
Run Code Online (Sandbox Code Playgroud)
.dockerignore
__pycache__
venv
.gitignore
.dockerignore
README.md
Dockerfile
docker-compose.yml
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml
version: '2'
services:
parkrep:
build:
context: ./
dockerfile: Dockerfile
volumes:
- ./output:/home/parkrep/output
command: ["python", "server.py"]
ports:
- "80:80"
Run Code Online (Sandbox Code Playgroud)
如果我运行,docker-compose up
我会得到以下信息
parkrep_1 | File "/home/parkrep/db_connector.py", line 45, in _connect_db
parkrep_1 | self._connection = sqlite3.connect(path, check_same_thread=False)
parkrep_1 | sqlite3.OperationalError: unable to open database file
parkrep_parkrep_1 exited with code 1
Run Code Online (Sandbox Code Playgroud)
如果我在 output/reports.db 创建数据库并再次启动 docker-compose,它会返回以下错误:
parkrep_1 | sqlite3.OperationalError: attempt to write a readonly database
Run Code Online (Sandbox Code Playgroud)
所以显然我没有写入文件的权限。我通过写入一个像这样挂载的测试文件来测试这种行为:
...
volumes:
- ./output:/home/parkrep/output
- ./test.txt:/home/parkrep/text.txt
command: bash -c "echo 'hallo' > test.txt"
Run Code Online (Sandbox Code Playgroud)
错误信息:
parkrep_1 | bash: text.txt: Permission denied
Run Code Online (Sandbox Code Playgroud)
让我们看看谁拥有这个文件:
parkrep_1 | drwxr-xr-x 7 root root 4.0K Dec 19 10:45 .
parkrep_1 | -rw-rw-r-- 1 root root 143 Dec 12 15:08 config.yaml
parkrep_1 | -rw-rw-r-- 1 root root 7.9K Dec 12 14:37 db_connector.py
parkrep_1 | drwxrwxr-x 2 4262 4262 4.0K Dec 19 11:10 output
parkrep_1 | -rw-rw-r-- 1 root root 144 Dec 12 13:20 requirements.txt
parkrep_1 | -rw-rw-r-- 1 root root 2.7K Dec 19 10:14 server.py
parkrep_1 | -rw-rw-r-- 1 4262 4262 2.7K Dec 19 10:14 test.txt
Run Code Online (Sandbox Code Playgroud)
事实证明,容器中没有用户 4262 但在主机上我的用户帐户具有此 ID。所以我想我现在知道问题是什么,但我不知道如何访问这些文件。我尝试在卷定义中添加“:rw”,但我仍然没有写权限。如果定义了卷,我如何告诉 docker 不更改文件/目录所有者。
我在想我的本地卷驱动程序有问题,但也许其他人已经遇到了这个问题,并且可以告诉我如何配置我的图像以获得所需的权限。
问候, 托马斯
docker info
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 19
Server Version: 1.12.5
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 19
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host bridge null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-53-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.56 GiB
Name: de3lxd-107769
ID: PU5F:LZ55:EEK7:W3R7:SYR3:336J:2VRH:35H2:MTLY:6Q6L:BWBP:EM5R
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
127.0.0.0/8
Run Code Online (Sandbox Code Playgroud)
docker-compose -v
docker-compose version 1.9.0, build 2585387
Run Code Online (Sandbox Code Playgroud)
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial
Run Code Online (Sandbox Code Playgroud)
我通过向每个人授予作家许可来解决这个问题。
mkdir output
touch output/reports.db output/database.log
chmod a+rw output output/*
Run Code Online (Sandbox Code Playgroud)
这将为主机上的用户和 docker 机器上的 root 用户授予权限,无论谁拥有这些文件。这只是一个肮脏的修复,因为我必须快点。任何进程都可以访问并编辑/删除文件。如果只有docker用户获得写入权限会更好,但我无法向主机上的root用户授予写入权限。
在这篇文章中,他们在容器中使用另一个用户(www-data)。构建镜像后,他们会获取用户的 ID,并用该 ID 替换当前文件所有者。如果您以此用户(www-data)启动容器,挂载将复制具有权限和所有者信息的文件,以便用户可以读取和写入这些文件。
这将是一种更安全的方式,因为您可以确保只有 docker 用户可以更改数据库/文件。因为我无法让这个工作适合我(似乎不适用于 id=0 的 root 用户),但我想指出,有一个更好的解决方案。
如果您只在 docker 停止后最终需要数据,您可以看看docker cp。
归档时间: |
|
查看次数: |
5148 次 |
最近记录: |