web-dev-qa-db-ja.com

Docker Composeを使用してファイルをコンテナーにコピーする

Dockerfileがあり、既存のディレクトリ(コンテンツを含む)をコンテナにコピーして正常に動作します:

Dockerfile

FROM php:7.0-Apache
COPY Frontend/ /var/www/html/aw3somevideo/
COPY Frontend/ /var/www/html/

RUN ls -al /var/www/html
RUN chown -R www-data:www-data /var/www/html 
RUN chmod -R 755 /var/www/html 

Screenshot of directory listing with docker exec

しかし、docker-compose.ymlファイルを使用すると、aw3somevideoディレクトリのみが存在し、aw3somevideo内には何もありません。

docker-compose.yml

 php:
    build: php/
    volumes:
      - ./Frontend/ :/var/www/html/
      - ./Frontend/index.php :/var/www/html/
    ports:
      - 8100:80

Screenshot of empty directory listing

volumesの機能を理解していない可能性があります。その場合は、docker-compose.ymlファイルを使用して既存のファイルをコンテナーにコピーする方法を教えてください。

58
TheDoctor

2017年4月に更新

元の答えを書いてから、振る舞いが変わりました。右側がmyvolumeのような名前付きボリュームを指定するか、/var/lib/myappのようなホスト上のパスを指定するかは一貫しています。例えば

    volumes:
      - /dir/on/Host:/var/www/html

/dir/on/Hostが存在しない場合、ホスト上に作成され、空のコンテンツが/var/www/htmlのコンテナにマウントされます。以前の/var/www/htmlにあったものはすべてアクセスできません。

----古い答え-----------

Docker-composeのvolumes:セクションは、/var/www/htmlディレクトリにあるものを上書きします。

2つの主な状況があります。

  1. ボリュームが存在します

    その場合、ボリュームのコンテンツはdstディレクトリにあるものを覆い隠します。

    例えば:

    volumes:
      - /dir/on/Host:/var/www/html
    
  2. ボリュームが存在しません

    myvolumeが存在しない場合(名前付きボリュームなど)、/ var/www/htmlのコンテンツが最初にボリュームにコピーされます

    volumes:
      - myvolume:/var/www/html
    

ケース2で、同じボリュームをコンテナに再度マウントしようとすると、ケース1に従います。

    volumes:
      - myvolume:/var/www/html

その場合(myvolumeがすでに作成されていると仮定)、/ var/ww/htmlのコンテンツは、myvolumeにあるものによって上書き(シャドウ)されます。

公式ドキュメントでは、詳細を説明しています https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

44
Bernard