2016-11-04 76 views
1

我想在泊塢窗安裝HTTPD,我寫了這樣的dockerfile:的httpd在碼頭工人無法啓動

FROM centos 

VOLUME /var/log/httpd 
VOLUME /etc/httpd 
VOLUME /var/www/html 

# Update Yum Repostory 
RUN yum clean all && \ 
    yum makecache fast && \ 
    yum -y update && \ 
    yum -y install httpd 
RUN yum clean all 
EXPOSE 80 
CMD /usr/sbin/httpd -D BACKGROUND && tail -f /var/log/httpd/access_log 

,如果我沒有主機捲上運行的圖像它的工作原理,但如果我使用參數失敗:

--volume /data/httpd/var/www/html:/var/www/html --volume /data/httpd/var/log:/var/log --volume /data/httpd/etc:/etc/httpd 

的錯誤信息是:

httpd: Could not open configuration file /etc/httpd/conf/httpd.conf: No such file or directory 

我檢查安裝點,其是空的:

# ll /data/httpd/etc/ 
total 0 

但是,如果我沒有在文件默認情況下,泊塢窗copys用「量」到一個臨時文件夾:

# ll /var/lib/docker/volumes/04f083887e503c6138a65b300a1b40602d227bb2bbb58c69b700f6ac753d1c34/_data 
total 4 
drwxr-xr-x. 2 root root 35 Nov 3 03:16 conf 
drwxr-xr-x. 2 root root 78 Nov 3 03:16 conf.d 
drwxr-xr-x. 2 root root 4096 Nov 3 03:16 conf.modules.d 
lrwxrwxrwx. 1 root root 19 Nov 3 03:16 logs -> ../../var/log/httpd 
lrwxrwxrwx. 1 root root 29 Nov 3 03:16 modules -> ../../usr/lib64/httpd/modules 
lrwxrwxrwx. 1 root root 10 Nov 3 03:16 run -> /run/httpd 

所以我很困惑,爲什麼搬運工拒絕將其複製到指定的位置?以及如何解決這個問題?

回答

2

這確實是一個記錄的行爲:在創建容器時

卷被初始化。如果容器的 基本映像包含指定安裝點上的數據,則在卷初始化時,現有數據 將被複制到新卷中。 (請注意,安裝主機目錄時,該 並不適用。)

即當你安裝的/ etc/httpd的--volume /數據/的httpd的/ etc中:/ etc/httpd的,沒有數據將被複制。

您也可以參考https://github.com/docker/docker/pull/9092瞭解更多關於它爲什麼以這種方式工作的原因(如果您有興趣)。

對此的常用解決方法是將您的初始數據複製到ENTRYPOINT或CMD腳本中的卷文件夾(來自容器內),如果它爲空,則爲 。

請注意,您的初始數據集必須保存在卷文件夾之外(例如,作爲/ opt中的.tar文件),因爲此文件夾將被安裝在其上的主文件夾遮蓋。

下面給出的是一個樣品Dockerfile和腳本,它可以說明問題:

樣品Dockerfile

FROM debian:stable 
RUN mkdir -p /opt/test/; touch /opt/test/initial-data-file 
VOLUME /opt/test 

示例腳本(嘗試各種卷映射)

#Build image 
>docker build -t volumetest . 

Sending build context to Docker daemon 2.56 kB 
Step 0 : FROM debian:stable 
---> f7504c16316c 
Step 1 : RUN mkdir -p /opt/test/; touch /opt/test/initial-data-file 
---> Using cache 
---> 1ea0475e1a18  
Step 2 : VOLUME /opt/test 
---> Using cache 
---> d8d32d849b82 
Successfully built d8d32d849b82 

#Implicit Volume mapping (as defined in Dockerfile) 
>docker run --rm=true volumetest ls -l /opt/test 
total 0 
-rw-r--r-- 1 root root 0 Nov 4 18:26 initial-data-file 

#Explicit Volume mapping 
> docker run --rm=true --volume /opt/test volumetest ls -l /opt/test/ 
total 0 
-rw-r--r-- 1 root root 0 Nov 4 18:26 initial-data-file 

#Explicitly Mounted Volume 
>mkdir test 
>docker run --rm=true --volume "$(pwd)/test/:/opt/test" volumetest ls -l /opt/test 
total 0 

這裏是一個簡單入口點腳本,說明可能的解決方法:

#!/bin/bash 
VOLUME=/opt/test 
DATA=/opt/data-volume.tar.gz 

if [[ -n $(find "$VOLUME" -maxdepth 0 -empty) ]] 
then 
    echo Preseeding VOLUME $VOLUME with data from $DATA... 
    tar -C "$VOLUME" -xvf "$DATA" 
fi 

"[email protected]" 

添加以下到Dockerfile

COPY data-volume.tar.gz entrypoint /opt/ 
ENTRYPOINT ["/opt/entrypoint"] 

首先運行:

>docker run --rm=true --volume "$(pwd)/test/:/opt/test" volumetest ls -l /opt/test 
Preseeding VOLUME /opt/test with data from /opt/data-volume.tar.gz... 
preseeded-data 
total 0 
-rw-r--r-- 1 1001 users 0 Nov 4 18:43 preseeded-data 

後續運行:

>docker run --rm=true --volume "$(pwd)/test/:/opt/test" volumetest ls -l /opt/test 
ls -l /opt/test 
total 0 
-rw-r--r-- 1 1001 users 0 Nov 4 18:43 preseeded-data 

注意,該卷文件夾將與填充數據, ,如果它是完全em pty之前。

+0

謝謝你,Zeppelin,但你是什麼意思「安裝主機目錄」?我正在使用「volume」參數,我希望它能夠做到文檔所說的:「在卷初始化時將現有數據複製到新卷中」,但它不會發生。 – user3593261

+0

掛載一個卷意味着你通過在命令行上同時指定主機文件系統文件夾(即_/date/httpd/etc/_),作爲容器內的卷(_/etc/httpd_)。 volume =/data/httpd/etc:/ etc/httpd。 (這是_mounted_卷的語法)。 這與使用--volume/etc/httpd簡單聲明卷不同(請注意,沒有指定主機文件夾路徑)。 – zeppelin

+0

謝謝你的解釋,但如果我不給它一個掛載點,它就沒有意義了。但是,我刪除了本地路徑(--volume =/etc/httpd),但它仍然失敗,因爲它創建了一個新的臨時文件夾,也沒有複製任何內容。 – user3593261