在應用docker容器的時(shí)候,更多的時(shí)候我們會(huì )把宿主機的目錄掛載到docker容器中。
在宿主機的文件夾權限隸屬于root時(shí),我們需要將文件夾的權限用戶(hù)進(jìn)行 chown 設置,才能保證目錄的內容的正常寫(xiě)入,
使用的是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 用戶(hù)創(chuàng )建,而 jenkins user的uid為1000
所以需要進(jìn)行 chown 設置,如下:
sudo chown -R 1000:1000 /opt/jenkins
然后重啟容器,錯誤就沒(méi)有了。
補充:介紹兩種從 Docker 容器寫(xiě)入卷時(shí)的文件權限處理方式
容器常常用作原生安裝工具的替代品。在主機上使用具有所需版本的容器要比使用過(guò)時(shí)的工具好的多。但是,只要容器與主機系統進(jìn)行交互,文件會(huì )留下錯誤或損壞的權限。
幸運的是,解決該問(wèn)題的方法并不需要使用腳本。
當容器掛載一個(gè)本地目錄并將文件寫(xiě)入其中時(shí),其所有權由容器內的用戶(hù)決定:
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
另外,您還可能無(wú)法刪除這些目錄和擁有錯誤所有權的文件。
一個(gè)非常常見(jiàn)的解決方案是從容器內部更改文件和目錄的所有權:
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$
這種方法的缺點(diǎn)是需要添加額外的邏輯,以及您需要知道運行該容器用戶(hù)的用戶(hù) ID 和組 ID。
第二種解決方案更簡(jiǎn)潔,它將使用容器內的正確所有權創(chuàng )建文件和目錄。Docker 提供了一個(gè)參數來(lái)設置容器內用戶(hù)的用戶(hù) 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$
這種方法可以很好的幫您解決用戶(hù) ID 和組 ID 的錯誤。
請注意,出于安全目的,在容器內以 root 身份運行是最糟糕的做法。Dockerfile 應始終使用 USER 指令從而避免直接使用 root 權限。
以上為個(gè)人經(jīng)驗,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站