簡體   English   中英

除非具有777權限,否則Docker無法寫入使用-v掛載的目錄

[英]Docker can't write to directory mounted using -v unless it has 777 permissions

我正在使用docker-solr圖像和docker,我需要在其中安裝一個目錄,我使用-v標志實現了該目錄。

問題是容器需要寫入我已掛載到其中的目錄,但似乎沒有權限這樣做,除非我在整個目錄上執行chmod 777 我不認為設置允許所有用戶讀取和寫入的權限是解決方案,但只是一個臨時的解決方法。

任何人都可以指導我找到更規范的解決方案嗎?

編輯:我一直在運行沒有sudo因為我把自己添加到了docker組。 我剛剛發現如果我用sudo運行docker問題就解決了,但我很好奇是否還有其他解決方案。

最近,在瀏覽了一些官方的docker存儲庫之后,我意識到解決這些權限問題的更慣用的方法是使用一個名為gosu的東西與入口點腳本串聯。 例如,如果我們采用現有的docker項目,例如solr,那就是我之前遇到問題的那個。

Github上的dockerfile非常有效地構建了整個項目,但沒有解決權限問題。

所以為了解決這個問題,首先我將gosu設置添加到dockerfile(如果你實現了這個通知,版本1.4是硬編碼的。你可以在這里檢查最新的版本)。

# grab gosu for easy step-down from root
RUN mkdir -p /home/solr \
    && gpg --keyserver pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    && curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture)" \
    && curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture).asc" \
    && gpg --verify /usr/local/bin/gosu.asc \
    && rm /usr/local/bin/gosu.asc \
    && chmod +x /usr/local/bin/gosu

現在我們可以使用gosu,它基本上與susudo完全相同,但與docker的工作效果更好。 從gosu的描述:

這是一個簡單的工具,它出於簡單的事實,即su和sudo具有非常奇怪且經常令人討厭的TTY和信號轉發行為。

現在我對dockerfile做的其他更改是這些添加這些行:

COPY solr_entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh
ENTRYPOINT ["/sbin/entrypoint.sh"]

只是將我的入口點文件添加到docker容器中。

並刪除該行:

USER $SOLR_USER

所以默認情況下你是root用戶。 (這就是為什么我們有gosu從root下台)。

至於我自己的入口點文件,我不認為它寫得很完美,但它完成了這項工作。

#!/bin/bash

set -e

export PS1="\w:\u docker-solr-> "

# step down from root when just running the default start command
case "$1" in
    start)
        chown -R solr /opt/solr/server/solr
        exec gosu solr /opt/solr/bin/solr -f
    ;;
    *)
        exec $@
    ;;
esac

docker run命令采用以下形式:

docker run <flags> <image-name> <passed in arguments>

基本上入口點說如果我想按照慣例運行solr,我們將參數start傳遞給命令的結尾,如下所示:

docker run <flags> <image-name> start

否則運行以root身份傳遞的命令。

start選項首先為solr用戶提供目錄的所有權,然后運行默認命令。 這解決了所有權問題,因為與dockerfile設置(一次性事物)不同,入口點每次都會運行。

所以現在如果我使用-d標志掛載目錄,在入口點實際運行solr之前,它將為您填充docker容器的文件。

至於這對容器外的文件有什么影響,我的結果好壞參半,因為docker在OSX上行為有點怪異。 對我來說,它沒有改變容器外的文件,但是在另一個操作系統上,其中docker與文件系統的關系更好,它可能會改變你的文件在外面,但我想這就是你要處理的內容,如果你想要的話將文件掛載到容器中而不是僅僅復制它們。

暫無
暫無

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

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