Amazon-Ec2

無法使用從 ubuntu 主機 (EC2) 根目錄中使用者創建的目錄安裝的捲創建 Docker 容器

  • August 11, 2021

我想創建一個 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而不是-v,即使有readonly選項。
  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 中會很容易。

***注意:*此答案僅適用於 Ubuntu(以及在某種程度上衍生髮行版)。它不應該應用於任何其他發行版。

問題的根本原因是你已經快速安裝並執行了 Docker,大多數人不應該這樣執行它。當一個被 snap 限制的程序啟動時,snapd 會創建一個容器來執行該程序,並且只有在程序啟動時可以訪問的文件才能被程序訪問。這包括您的新目錄/data,它在 docker 正在執行的 snap 容器中不存在,這就是 docker 嘗試(並且失敗)創建它的原因。

也不應該使用 Ubuntu 自帶的 docker 版本,因為它沒有保持最新。(他們真的應該保持更新或完全放棄它,但不要指望這兩種情況很快就會發生。)

大多數人應該使用官方 Docker 儲存庫中的 Docker,以避免 Ubuntu 的 docker 包出現的各種問題。

引用自:https://serverfault.com/questions/1074146