![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxIzYmFWZygDN0MmMlJmM1gTZ1AjNzY2M5YWO1YWOxczNidTOjNWNx8CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
出品丨Docker公司(ID:docker-cn)
編譯丨小東
每周一、三、五,與您不見不散!
容器常常用作原生安裝工具的替代品。在主機上使用具有所需版本的容器要比使用過時的工具好的多。但是,隻要容器與主機系統進行互動,檔案會留下錯誤或損壞的權限。幸運的是,解決該問題的方法并不需要使用腳本。
問題描述
當容器挂載一個本地目錄并将檔案寫入其中時,其所有權由容器内的使用者決定:
nicholas@host:~/source$ mkdir source
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source ubuntu
root@a031d11c9515:/source# mkdir subdir
root@a031d11c9515:/source# touch subdir/newfile
root@a031d11c9515:/source# exit
exit
nicholas@host:~/source$ ls -lR
.:
total 4
drwxr-xr-x 2 root root 4096 Jul 16 19:35 subdir
./subdir:
total 0
-rw-r--r-- 1 root root 0 Jul 16 19:35 newfile
nicholas@host:~/source$ rm -rf subdir/
rm: cannot remove 'subdir/newfile': Permission denied
另外,您還可能無法删除這些目錄和擁有錯誤所有權的檔案。
解決方案1:從容器中删除
一個非常常見的解決方案是從容器内部更改檔案和目錄的所有權:
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source ubuntu
root@d1c3bee8bb2b:/source# ls -al
total 12
drwxrwxr-x 3 1000 1004 4096 Jul 16 19:35 .
drwxr-xr-x 1 root root 4096 Jul 16 19:39 ..
drwxr-xr-x 2 root root 4096 Jul 16 19:35 subdir
root@d1c3bee8bb2b:/source# chown 1000:1000 subdir/ -R
root@d1c3bee8bb2b:/source# ls -l
total 4
drwxr-xr-x 2 1000 1000 4096 Jul 16 19:35 subdir
root@d1c3bee8bb2b:/source# exit
exit
nicholas@host:~/source$ ls -l
total 4
drwxr-xr-x 2 nicholas lpadmin 4096 Jul 16 19:35 subdir
nicholas@host:~/source$
這種方法的缺點是需要添加額外的邏輯,以及您需要知道運作該容器使用者的使用者 ID 群組 ID。
解決方案2:建立擁有正确所有權的檔案
第二種解決方案更簡潔,它将使用容器内的正确所有權建立檔案和目錄。Docker 提供了一個參數來設定容器内使用者的使用者 ID 群組 ID:
nicholas@host:~/source$ docker run -it --rm --volume $(pwd):/source --workdir /source --user $(id -u):$(id -g) ubuntu
groups: cannot find name for group ID 1004
I have no name!@bf7f355f3b65:/source$ touch newfile
I have no name!@bf7f355f3b65:/source$ exit
exit
nicholas@host:~/source$ ls -l
total 4
-rw-r--r-- 1 nicholas nicholas 0 Jul 16 19:42 newfile
drwxr-xr-x 2 nicholas lpadmin 4096 Jul 16 19:35 subdir
nicholas@host:~/source$
這種方法可以很好的幫您解決使用者 ID 群組 ID 的錯誤。
請注意,出于安全目的,在容器内以 root 身份運作是最糟糕的做法。Dockerfile 應始終使用 USER 指令進而避免直接使用 root 權限。