無法建立包含從 ubuntu 主機 (EC2) 根目錄中使用者建立的目錄掛載的磁碟區的 Docker 容器

無法建立包含從 ubuntu 主機 (EC2) 根目錄中使用者建立的目錄掛載的磁碟區的 Docker 容器

我想建立一個 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

附加資訊

即使我執行以下操作,我也會遇到相同的錯誤:

  1. 即使使用該選項,也可以使用--mount代替。-vreadonly
  2. 使用 執行上面的命令sudo
  3. 將權限/data目錄變更為777
  4. 所有權從 更改ubunturoot
  5. 掛載一個子目錄,例如/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 軟體包出現的各種問題。

相關內容