2016-09-16 102 views
2

我正在嘗試創建一個nginx docker容器(提供文件上傳/下載)。 在html根目錄下,我正在創建一些額外的子文件夾(上傳和下載)。碼頭不會在nginx html根目錄中創建文件夾

我把nginx docker鏡像作爲我的基礎,並添加了一些額外的行來創建/初始化子文件夾。

FROM nginx 

MAINTAINER Carl Wainwright <[email protected]> 

ENV HTML_PATH /var/www/html 
COPY nginx.conf /etc/nginx/nginx.conf 

RUN mkdir -p $HTML_PATH/upload && mkdir -p $HTML_PATH/download 
RUN chmod 755 $HTML_PATH/upload && mkdir chmod 755 $HTML_PATH/download 
RUN chown nginx:nginx $HTML_PATH/upload && chown nginx:nginx $HTML_PATH/download 

在我的碼頭工人,撰寫文件,我創造我的容器如下:

wbh-device-asset-server: 
    restart: always 
    image: wbh-device-asset-server/nginx:test 
    container_name: wbh-device-asset-server 
    volumes: 
    - /www-data:/var/www/html 
    ports: 
    - "8081:8081" 
    networks: 
    - mynetwork 

我的nginx的配置具有以下服務器配置。

server { 
    error_log /var/log/nginx/error.log debug; 
    access_log /var/log/nginx/access.log main; 

    # Running port 
    listen 8081; 

    # Proxy requests to get SDP's 
    location ~ \.sdp { 
     root /var/www/html; 

     try_files $uri =404; 

     limit_except GET   { deny all; } 
    } 

    # Proxy requests to put APD's. 
    location ~ \.(apd) { 

     dav_methods PUT; 
     limit_except PUT   { deny all; } 

     client_body_temp_path  /tmp/files/; 
     client_body_in_file_only on; 
     client_body_buffer_size 128K; 
     client_max_body_size  30M; 

    } 

在我的本地機器上存在/ www-data存在並具有寫入權限。 每次我把容器放到/ www-data的內容都是空的。

爲什麼我無法在/ var/www/html /下創建文件夾?什麼阻止我這樣做。

注意:作爲我的疑難解答的一部分,我創建了一個基於centos的docker鏡像,並從軟件包中安裝了nginx,並面臨同樣的問題。

+0

當您從主機安裝文件夾到容器時,主機文件夾內容盛行,並且在安裝前您將看不到創建**的容器文件夾。 –

+0

現在是完美的感覺.. –

回答

3

Dockerfile創建一個圖像,這是用來運行容器的定義,而不是容器本身,並且每個圖像創建只運行一次。因此,所有RUN命令都會在那裏發生,並用您期望的目錄更新您的映像。

在您創建容器的docker-compose.yml中,您有一個主機卷裝入。卷是在容器上執行的,而不是映像版本,所以在Dockerfile的RUN命令已經更新映像後,將掛載此目錄。使用主機卷時,主機上該目錄的內容完全覆蓋圖像的內容,它們不會被刪除,但您將無法在具有該卷裝載的任何容器中看到它們。如果您使用了一個命名卷,並且該命名卷恰好爲空,例如在您第一次創建它之後,Docker會將圖像目錄的內容複製到卷中,然後再將其安裝到容器中。

所以,你的3個選項是:

  1. 不要使用在所有的體積和您的文件將是可見的。如果你想在容器之間保存這些數據,不建議使用。

  2. 使用指定的卷。這可以像將音量源從完全限定的目錄/www-data更改爲名稱www-data一樣簡單。如果你這樣做,你將無法從主機輕鬆管理該文件夾的內容,Docker將通過它的內部目錄結構來管理它,並且你想通過容器來管理它。

  3. 只需將所需文件添加到主機上的目錄即可。這是您剛開始時最簡單的解決方案,但請注意,主機上的用戶可能與容器中的用戶不匹配,因此您可能會看到需要使用chmodchown命令修復的權限和uid錯誤。

+0

我現在明白宿主卷掛載圖像文件夾的問題。對於我的設置,一旦容器運行,我不需要修改我的html根目錄的內容。我只需要公開html根目錄的內容。從你的解釋看來,選項2)是我所需要的。當你說命名卷時,你的意思是使用Dockerfile中的VOLUME? –

+0

我忘了提及我需要在容器啓動並運行後讀取/寫入安裝卷的功能。 –

+0

如果您在Dockerfile中聲明瞭卷,默認情況下它不會有名稱,但每次運行容器時都會創建一個匿名GUID卷。我不推薦這個。如上所述,在您的docker-compose.yml中將音量源從'/ www-data'改爲'www-data',它將爲您創建一個命名音量。如果您不希望該特定容器有權訪問卷,則可以在卷安裝結束時指定':ro'。 – BMitch

相關問題