Docker容器沒有權(quán)限寫入宿主機目錄的解決方案
在應(yīng)用docker容器的時候,更多的時候我們會把宿主機的目錄掛載到docker容器中。
在宿主機的文件夾權(quán)限隸屬于root時,我們需要將文件夾的權(quán)限用戶進行 chown 設(shè)置,才能保證目錄的內(nèi)容的正常寫入,
下面是一個例子:
使用的是docker版本的jenkins,運行后,出現(xiàn)如下錯誤:
[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 設(shè)置,如下:
sudo chown -R 1000:1000 /opt/jenkins
然后重啟容器,錯誤就沒有了。
補充:介紹兩種從 Docker 容器寫入卷時的文件權(quán)限處理方式
說在前面
容器常常用作原生安裝工具的替代品。在主機上使用具有所需版本的容器要比使用過時的工具好的多。但是,只要容器與主機系統(tǒng)進行交互,文件會留下錯誤或損壞的權(quán)限。
幸運的是,解決該問題的方法并不需要使用腳本。
問題描述
當(dāng)容器掛載一個本地目錄并將文件寫入其中時,其所有權(quán)由容器內(nèi)的用戶決定:
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
另外,您還可能無法刪除這些目錄和擁有錯誤所有權(quán)的文件。
解決方案1:從容器中刪除
一個非常常見的解決方案是從容器內(nèi)部更改文件和目錄的所有權(quá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$
這種方法的缺點是需要添加額外的邏輯,以及您需要知道運行該容器用戶的用戶 ID 和組 ID。
解決方案2:創(chuàng)建擁有正確所有權(quán)的文件
第二種解決方案更簡潔,它將使用容器內(nèi)的正確所有權(quán)創(chuàng)建文件和目錄。Docker 提供了一個參數(shù)來設(shè)置容器內(nèi)用戶的用戶 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 的錯誤。
請注意,出于安全目的,在容器內(nèi)以 root 身份運行是最糟糕的做法。Dockerfile 應(yīng)始終使用 USER 指令從而避免直接使用 root 權(quán)限。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
docker中容器的網(wǎng)絡(luò)配置常用命令詳解
這篇文章主要介紹了docker中容器的網(wǎng)絡(luò)配置常用命令詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10docker pure-ftp 搭建ftp服務(wù)器的方法
本篇文章主要介紹了docker pure-ftp 搭建ftp服務(wù)器的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04centos下docker安裝及springboot遠程發(fā)布docker的方法
這篇文章主要介紹了centos下docker安裝及springboot遠程發(fā)布docker的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04手動構(gòu)建自己的docker容器鏡像實戰(zhàn)
這篇文章主要介紹了如何手動構(gòu)建自己的鏡像并上傳到鏡像倉庫中,文中有詳細的代碼實例,需要的朋友可以參考閱讀2023-04-04