web-dev-qa-db-ja.com

docker-compose buildまたはdocker-compose upでファイル/フォルダーを作成する

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しか取得できません。

15
Brentg

画像にはこれらのファイルが含まれています

Dockerfileには、イメージの作成方法に関する指示が含まれています。そのDockerfileから作成したイメージdoesにはindex.htmlimages/が含まれます。

しかし、あなたはコンテナでそれらを過剰に使いました

実行時に、作成したイメージからコンテナを作成しました。そのコンテナで、外部ディレクトリ./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に事前入力するだけのオプションもあります。その後、コンテナが開始され、ディレクトリマウントが追加されると、それらはちょうどそこにあります。

18
Dan Lowe