- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个 flask 服务器(在带有 python 3.5 的 virtualenv 中),它用作 REST API(仅用于 flask 建议的开发)。一开始它连接到本地 sqlite 数据库,它会尽快提交任何数据库更改。现在我想在 docker 容器中运行所有内容,我想知道如何访问数据库,因为 sqlite 文件位于容器中。
所以我在 docker-compose 文件中创建了一个卷,它指向构建应用程序的 dockerfile。
docker 文件:
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"]
.dockerignore
__pycache__
venv
.gitignore
.dockerignore
README.md
Dockerfile
docker-compose.yml
docker-compose.yml
version: '2'
services:
parkrep:
build:
context: ./
dockerfile: Dockerfile
volumes:
- ./output:/home/parkrep/output
command: ["python", "server.py"]
ports:
- "80:80"
如果我运行 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
如果我在 output/reports.db 中创建数据库并再次启动 docker-compose,它会返回以下错误:
parkrep_1 | sqlite3.OperationalError: attempt to write a readonly database
显然我没有写入文件的权限。我通过写入一个像这样安装的测试文件来测试这种行为:
...
volumes:
- ./output:/home/parkrep/output
- ./test.txt:/home/parkrep/text.txt
command: bash -c "echo 'hallo' > test.txt"
错误信息:
parkrep_1 | bash: text.txt: Permission denied
让我们看看谁拥有这个文件:
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
原来容器中没有用户 4262 但在主机上我的用户帐户有这个 id。所以我想我知道现在的问题是什么,但我不知道如何访问这些文件。我尝试将“:rw”添加到卷定义中,但我仍然没有写权限。如果定义了卷,我如何告诉 docker 不要更改文件/目录所有者。
我在想我的本地卷驱动程序有问题,但也许其他人已经遇到过这个问题并且可以告诉我如何配置我的图像以获得所需的权限。
您好,托马斯
docker 信息
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
docker-compose -v
docker-compose version 1.9.0, build 2585387
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial
最佳答案
我通过向所有人授予作者权限解决了这个问题。
mkdir output
touch output/reports.db output/database.log
chmod a+rw output output/*
这将授予主机上的用户和 docker 机器上的 root 用户权限,无论谁拥有文件。这只是一个肮脏的修复,因为我必须快点。任何进程都可以访问和编辑/删除文件。如果只有 docker 用户获得写入权限会更好,但我无法将写入权限授予主机上的 root 用户。
在此post他们在容器中使用另一个用户 (www-data)。构建图像后,他们获得用户的 ID 并用此 ID 替换当前文件所有者。如果您以此用户 (www-data) 启动容器,挂载将复制具有权限和所有者信息的文件,因此用户可以读取和写入这些文件。
这将是一种更安全的方式,因为您确保只有 docker 用户可以更改数据库/文件。因为我无法让这个对我有用(似乎对 id=0 的 root 用户不起作用),但我想指出,有一个更好的解决方案。
如果您只需要 docker 停止后最后的数据,您可以查看 docker cp .
关于python - Docker volume - 需要权限才能写入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41221532/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!