%20%E6%A0%B9%E7%9B%AE%E9%8C%84%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%80%85%E5%BB%BA%E7%AB%8B%E7%9A%84%E7%9B%AE%E9%8C%84%E6%8E%9B%E8%BC%89%E7%9A%84%E7%A3%81%E7%A2%9F%E5%8D%80%E7%9A%84%20Docker%20%E5%AE%B9%E5%99%A8.png)
我想建立一個 Docker 容器,其中有一個從 Docker 主機根目錄中使用者建立的目錄掛載的磁碟區。主機是 Ubuntu EC2 執行個體。
錯誤
我想將/data
以下目錄掛載到 Docker 容器中,但出現錯誤:
ubuntu:~$ ls -l /
total 120
drwxr-xr-x 25 root root 4096 Aug 10 20:51 ./
drwxr-xr-x 25 root root 4096 Aug 10 20:51 ../
drwxr-xr-x 2 root root 4096 Jul 22 13:50 bin/
drwxr-xr-x 3 root root 4096 Jul 22 13:50 boot/
drwxr-xr-x 4 ubuntu ubuntu 4096 Aug 10 19:58 data/
...
drwxr-xr-x 8 root root 4096 May 30 12:19 home/
...
drwxr-xr-x 3 root root 4096 Jun 20 13:39 mnt/
...
drwxr-xr-x 12 root root 4096 Jun 12 01:03 usr/
ubuntu:~$ docker run -it --rm -v /data:/data alpine
docker: Error response from daemon: error while creating mount source path '/data': mkdir /data: read-only file system.
如果我使用實例附帶的目錄(例如/usr
),則相同的命令有效:
ubuntu:~$ docker run -it --rm -v /usr:/data alpine
/ # ls /data
bin games include lib lib32 local sbin share src
附加資訊
即使我執行以下操作,我也會遇到相同的錯誤:
- 即使使用該選項,也可以使用
--mount
代替。-v
readonly
- 使用 執行上面的命令
sudo
。 - 將權限
/
和data
目錄變更為777
- 所有權從 更改
ubuntu
為root
- 掛載一個子目錄,例如
/data/subdir
.
此df
指令表示實例的根目錄上沒有特殊的掛載:
ubuntu:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 872K 1.6G 1% /run
/dev/xvda1 194G 180G 14G 93% /
tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/loop0 132M 132M 0 100% /snap/docker/796
/dev/loop2 25M 25M 0 100% /snap/amazon-ssm-agent/4046
/dev/loop3 56M 56M 0 100% /snap/core18/2128
/dev/loop1 100M 100M 0 100% /snap/core/11316
/dev/loop4 100M 100M 0 100% /snap/core/11420
/dev/loop5 56M 56M 0 100% /snap/core18/2074
/dev/loop6 34M 34M 0 100% /snap/amazon-ssm-agent/3552
s3fs 256T 0 256T 0% /mnt/s3
tmpfs 1.6G 0 1.6G 0% /run/user/1000
docker 守護程式以 root 身分執行:
ubuntu:~/$ ps -ef | grep dockerd
root 964 1 1 19:49 ? 00:00:55 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/796/config/daemon.json
root 1302 1 0 19:49 ? 00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ubuntu 6868 2649 0 21:20 pts/1 00:00:00 grep --color=auto dockerd
提前致謝。這是一個令人煩惱的問題,我以為在 Docker 和 AWS/EC2 中這會很容易。
答案1
筆記:這個答案僅適用於 Ubuntu(以及某種程度上的衍生發行版)。它不應該應用於任何其他發行版。
問題的根本原因是你已經以快照方式安裝並運行了 Docker,而大多數人不應該以這種方式運行它。當一個受snap限制的程式啟動時,snapd會建立一個容器來執行該程序,並且只有程式啟動時可以存取的檔案才能被該程式存取。這包括您的新目錄/data
,該目錄在 docker 運行的快照容器中不存在,這就是 docker 嘗試(但失敗)建立它的原因。
Ubuntu 本身附帶的 docker 版本也不應該使用,因為它沒有保持最新。 (他們確實應該保持更新或完全放棄它,但不要指望這兩種情況很快就會發生。)
大多數人應該使用來自官方 Docker 儲存庫的 Docker以避免 Ubuntu 的 docker 軟體包出現的各種問題。