Dockerへの最初のステップを試しているので、単純なindex.htmlとディレクトリイメージを作成するDockerfileを作成してみました(以下のコードを参照)
次に、docker-composeビルドを実行してイメージを作成し、docker-compose-upを実行してサーバーを実行します。しかし、ファイルindex.htmlまたはフォルダー画像は取得しません。
これは私のDockerfileです:
FROM php:Apache
MAINTAINER [email protected]
WORKDIR /var/www/html
RUN touch index.html \
&& mkdir images
そして、これは私のdocker-compose.ymlです
version: '2'
services:
web:
build: .docker/web
ports:
- "80:80"
volumes:
- ./docroot:/var/www/html
これにより、イメージディレクトリとindex.htmlを含むdocrootフォルダーが作成されると予想されますが、docrootしか取得できません。
Dockerfileには、イメージの作成方法に関する指示が含まれています。そのDockerfileから作成したイメージdoesにはindex.html
とimages/
が含まれます。
実行時に、作成したイメージからコンテナを作成しました。そのコンテナで、外部ディレクトリ./docroot
を/var/www/html
としてマウントしました。
マウントは以前にそのパスにあったものを隠しますので、このマウントは/var/www/html
の以前の内容を隠し、./docroot
にあるものと置き換えます。
あなたが尋ねたコメントで
最初にマウントしてからファイルなどを作成する可能性はありますか?それとも不可能ですか?
あなたが物事を行った方法では、元のファイルの上にマウントしたので、コンテナが作成されるとそれらはもはやアクセスできなくなります。
これを処理する方法はいくつかあります。
これらのファイルをイメージの別のパスに配置した場合、マウントによって上書きされません。
WORKDIR /var/www/alternate-html
RUN touch index.html \
&& mkdir images
WORKDIR /var/www/html
これで、実行時に/var/www/html
にこのマウントが保持され、外部ディレクトリのコンテンツが含まれます。空のディレクトリである場合とそうでない場合があります。必要に応じて、起動時にコンテナにスクリプトを実行してそこにコピーするように指示できます。
COPY entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
(これは、エントリポイントが定義されていないことを前提としています-持っている場合は、代わりに既存のスクリプトを調整する必要があるだけです。)
entrypoint.sh:
#!/bin/sh
cp -r /var/www/alternate-html/* /var/www/html
exec "$@"
これはcp
コマンドを実行し、この画像のCMD
が何であれ制御を渡します。
また、必要なファイルを外部で./docroot
に事前入力するだけのオプションもあります。その後、コンテナが開始され、ディレクトリマウントが追加されると、それらはちょうどそこにあります。