佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Docker容器沒有權限寫入宿主機目錄的解決方案

Docker容器沒有權限寫入宿主機目錄的解決方案

熱門標簽:智能手機 網站建設 使用U盤裝系統(tǒng) 阿里云 美圖手機 百度競價點擊價格的計算公式 檢查注冊表項 硅谷的囚徒呼叫中心

在應用docker容器的時候,更多的時候我們會把宿主機的目錄掛載到docker容器中。

在宿主機的文件夾權限隸屬于root時,我們需要將文件夾的權限用戶進行 chown 設置,才能保證目錄的內容的正常寫入,

下面是一個例子:

使用的是docker版本的jenkins,運行后,出現如下錯誤:

[root@localhost CICD]# docker logs -f jenkins 
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

我jenkins掛載的目錄是 /opt/jenkins/xxxxx,root 用戶創(chuàng)建,而 jenkins user的uid為1000

所以需要進行 chown 設置,如下:

sudo chown -R 1000:1000 /opt/jenkins

然后重啟容器,錯誤就沒有了。

補充:介紹兩種從 Docker 容器寫入卷時的文件權限處理方式

說在前面

容器常常用作原生安裝工具的替代品。在主機上使用具有所需版本的容器要比使用過時的工具好的多。但是,只要容器與主機系統(tǒng)進行交互,文件會留下錯誤或損壞的權限。

幸運的是,解決該問題的方法并不需要使用腳本。

問題描述

當容器掛載一個本地目錄并將文件寫入其中時,其所有權由容器內的用戶決定:

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:創(chuàng)建擁有正確所有權的文件

第二種解決方案更簡潔,它將使用容器內的正確所有權創(chuàng)建文件和目錄。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 權限。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽:懷化 湘潭 黃山 山南 通遼 賀州 湖北 煙臺

巨人網絡通訊聲明:本文標題《Docker容器沒有權限寫入宿主機目錄的解決方案》,本文關鍵詞  ;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    抚顺市| 寻乌县| 元谋县| 论坛| 长武县| 湘乡市| 建昌县| 重庆市| 七台河市| 丹寨县| 汾阳市| 石台县| 高要市| 同德县| 石城县| 绥江县| 汾阳市| 界首市| 衡南县| 宣汉县| 吐鲁番市| 柳河县| 阿荣旗| 临朐县| 临汾市| 河北区| 那曲县| 方城县| 横峰县| 扎鲁特旗| 岳普湖县| 北宁市| 平利县| 托克托县| 北流市| 泾川县| 赞皇县| 呼和浩特市| 仙桃市| 津市市| 垦利县|