名前付きのデータボリューム(データコンテナーではない)の使用方法について混乱しています。
名前付きデータボリュームがありますapp_src
にマウントされている/usr/src/app
docker作成ファイルを使用します。ただし、ソースコードを(ローカルで)変更した後、イメージをビルドしてもボリュームは更新されません。
私はそのようにイメージを構築しています、
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を使用しています。私の理解は間違っていますか?ドキュメントを確認しましたが、ボリュームを非常によく説明しているものは何でも見つかりました。
名前付きボリュームマウントと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またはボリュームを削除して新しいボリュームを作成する)、コンテナーを再起動することで、これを回避することもできます。コンテナの起動時に、空の名前付きボリュームが含まれている場合、デフォルトでは、その場所にあるイメージの内容がボリュームにコピーされます。
ボリュームを同じ場所に何度もマウントします。 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コマンドの予想される動作と一致しています。