web-dev-qa-db-ja.com

Dockerという名前のボリュームが更新されない

名前付きのデータボリューム(データコンテナーではない)の使用方法について混乱しています。

名前付きデータボリュームがありますapp_srcにマウントされている/usr/src/appdocker作成ファイルを使用します。ただし、ソースコードを(ローカルで)変更した後、イメージをビルドしてもボリュームは更新されません。

私はそのようにイメージを構築しています、

docker-compose -f development.yml buildそしてそれを実行するdocker-compose -f development.yml up -d

ボリュームが変更されていないことを確認するために、実行中のコンテナーに接続しましたが、ソースコードは更新されていません。

これが私のdocker作成ファイルですdevelopment.ymlおよびDockerfile(私のwebサービス用)。バージョン:「2」

services:
  web:
    restart: always
    build: ./web
    expose:
      - "8000"
    volumes:
      - app_src:/usr/src/app
    links:
      - postgres:postgres
    env_file: development.env
    command: ./start_web.sh

volumes:
   app_src: {}


FROM python:3.4.4

WORKDIR /usr/src/app
RUN rm -rf /usr/src/app/*
COPY . /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

そのようにホストをマウントすることでそれを機能させることができました、

volumes:
    - ./web/src:/usr/src/app

Docker1.11.2を実行しているUbuntu16.04を使用しています。私の理解は間違っていますか?ドキュメントを確認しましたが、ボリュームを非常によく説明しているものは何でも見つかりました。

14
Shulhi Sapli

名前付きボリュームマウントとDockerfileを使用してdocker-composeを使用して、その場所のコンテンツを変更しようとしているようです。 Dockerfileがイメージを作成しているため、これは機能しません。 docker-composeは、そのイメージの上で実行される実行中のコンテナーを定義しています。ボリュームはイメージが作成された後にのみマウントされ、コンテナーを実行するため、イメージ作成内でボリュームを変更することはできません。

名前付きボリュームを更新する場合は、サイドコンテナーを検討してください。

docker run -v app_src:/target -v `pwd`/web/src:/source --rm \
  busybox /bin/sh -c "tar -cC /source . | tar -xC /target"

そのコンテナをオンデマンドで実行して、名前付きボリュームを更新できます。 tarをgit cloneのようなものに置き換えて、ソースリポジトリからプルすることもできます。大きなリポジトリに小さな変更を加える場合は、rsync(イメージにインストールする必要があります)を置き換えることもできます。

名前付きボリュームを空にして(rm -rf/vol/dirまたはボリュームを削除して新しいボリュームを作成する)、コンテナーを再起動することで、これを回避することもできます。コンテナの起動時に、空の名前付きボリュームが含まれている場合、デフォルトでは、その場所にあるイメージの内容がボリュームにコピーされます。

11
BMitch

ボリュームを同じ場所に何度もマウントします。 1回目はコンテナがホストファイルシステムにデータを保存し、2回目はホストファイルシステムからコンテナにデータを上書きします。 docker-composeファイルからボリュームマウントを削除する

volumes: - ./web/src:/usr/src/app #remove this!

あなたは追加情報を得ることができます ここ

$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

このコマンドは、ホストディレクトリ/ src/webappを/ opt/webappのコンテナにマウントします。パス/ opt/webappがコンテナーのイメージ内にすでに存在する場合、/ src/webappマウントはオーバーレイしますが、既存のコンテンツを削除しません。マウントが取り外されると、コンテンツに再びアクセスできるようになります。これは、mountコマンドの予想される動作と一致しています。

1
Bukharov Sergey