簡體   English   中英

Docker Jetty 應用程序無權限寫入已安裝的卷

[英]Docker Jetty app no permission writing on mounted volume

對於這個愚蠢的問題,我很抱歉,我是 Docker 的新手。我正在嘗試在官方碼頭 docker 容器中部署我的 Java 應用程序,一切正常,但是,當我的應用程序嘗試將文件寫入已安裝的卷時,它沒有權限,因為目標文件夾屬於root用戶,但碼頭以碼頭用戶身份運行。 如何啟動以 root 身份運行的碼頭服務器,以便為我的應用程序提供所需的所有權限?

第一種方法

使用chown jetty:jetty path更改您嘗試處理的文件夾的所有者

第二種方法

將 jetty 添加到 sudoers 以便 jetty 可以使用usermod -aG sudo jetty訪問根文件夾

這兩種方法都需要在容器內部,因為您沒有使用自定義 dockerfile。從 docker 中檢索您的容器 ID ps -a 然后

docker exec -it container_id bash

並嘗試上面我建議的 2 種方法來 chown 文件夾。 完成后重啟容器docker restart container_id

如何啟動以 root 身份運行的碼頭服務器,以便為我的應用程序提供所需的所有權限?

啟動容器時指定用戶:

docker run -d --user root:root --name jetty -v ... jetty:jdk13

這會起作用,但這不是一個好的做法,因為它給運行容器的用戶太多的權利。
默認情況下,大多數圖像都是由具有嚴格要求的權限的應用程序用戶啟動的,以防止出現這種情況。

我是 Docker 的新手。

初學者或有經驗的人,當您想在您不知道的圖像上“玩”用戶/卷時,經驗法則是閱讀其文檔 如果這還不夠,您仍然可以深入了解其 DockerFile。
在文檔中,您可以閱讀:

默認情況下,此映像以 root 用戶身份啟動,並使用 Jetty 的 setuid 模塊在初始化后將權限降給用戶 jetty。 /var/lib/jetty 中的 JETTY_BASE 目錄屬於 jetty:jetty(uid 999,gid 999)。

事實上,這並不詳盡。 Jetty 在容器中使用的所有目錄都歸 Jetty 所有:

圖中默認的 Jetty 環境為:

JETTY_HOME = /usr/local/碼頭

JETTY_BASE = /var/lib/碼頭

TMPDIR = /tmp/碼頭

如果您掛載/綁定到該目錄,那將起作用,但這看起來像是一個 hack,因為它們不是為存儲應用程序數據而設計的。
這里更簡潔的方法是自定義圖像以在圖像上添加一個旨在存儲應用程序數據的文件夾。
那並不難。

1)為自定義碼頭圖像創建一個DockerFile
例如my-jetty-DockerFile

FROM jetty:jdk13
VOLUME my-app-data
RUN mkdir my-app-data
RUN chown jetty:jetty my-app-data

2)構建該圖像:

docker build -t jetty-with-data-vol:jdk13 -f my-jetty-DockerFile . 

3) 使用已安裝的卷啟動該圖像的容器:

docker run -d  --name my-jetty -v jetty-vol:/my-app-data jetty-with-data-vol:jdk13 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM