私はREST APIとして使用されるフラスコサーバー(python 3.5のvirtualenv内)で作業しています(フラスコで提案されている開発専用)。最初に、ローカルの sqlite データベースに接続し、データベースの変更をできるだけ早くコミットします。今、私はdockerコンテナですべてを実行したいと思っていましたが、sqliteファイルがコンテナにあるため、データベースにどのようにアクセスできるのか疑問に思っていました.
そこで、アプリケーションを構築する dockerfile を指す docker-compose ファイルにボリュームを作成しました。
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"]
.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 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
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