2016-11-04 14 views
1

を起動することはできません、私はこのようなdockerfileを書いた:httpdのは、私がドッキングウィンドウで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とスクリプト、次のとおりです。

サンプル

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

Dockerfileにサンプルスクリプト(様々なボリュームマッピングを試してみてください)

#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 

をそしてここにあります回避策を示す簡単なエントリポイントスクリプト:

ボリュームフォルダが のみが移入されることを、

>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 

注:

>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 

以降の実行:

はDockerfile

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

まず実行するには、次の追加しますデータ、完全に一致した場合は 前にpty。

+0

Zeppelinありがとうございますが、「ホストディレクトリをマウントしていますか?私は "ボリューム"パラメータを使用しています、私はそれはドキュメントが何を言うことができることを望む: "既存のデータはボリュームの初期化時に新しいボリュームにコピーされます"しかし、それは起こりません。 – user3593261

+0

ボリュームをマウントするということは、コンテナ内のボリューム(_/etc/httpd_)としてホストファイルシステムフォルダ(つまり_/date/httpd/etc/_)をコマンドラインで両方指定することによって実現することを意味します。ボリューム=/data/httpd/etc:/ etc/httpd。 (これは_mounted_ボリュームの構文です)。 --volume/etc/httpdでボリュームを宣言するのとは異なります(ホストフォルダのパスが指定されていないことに注意してください)。 – zeppelin

+0

あなたの説明をありがとうございますが、私はそれにマウントポイントを与えないと意味がありません。しかし、ローカルパス(--volume =/etc/httpd)を削除しましたが、それは新しい一時フォルダを作成して何もコピーされていないため、まだ失敗しました。 – user3593261

関連する問題