2016-07-18 11 views
7

名前付きデータボリューム(データコンテナではない)をどのように使用すべきか混乱しています。Dockerという名前のボリュームが更新されていません

ドッキング用ファイルを使用して/usr/src/appにマウントされた名前付きデータボリュームapp_srcがあります。しかし、ソースコードを変更した後(ローカル)には、イメージをビルドしてもボリュームは更新されません。私はそうのようなイメージを構築してい

docker-compose -f development.yml build、それdocker-compose -f development.yml up -dを実行しています。

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

私のwebサービスのための私のドッカーの作成ファイルdevelopment.ymlDockerfileはここにあります。 版: '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 

私はドッキングウィンドウ1.11.2を実行しているのUbuntu 16.04上です。私の理解は間違っていますか?私はドキュメンテーションを見ましたが、ボリュームを本当にうまく説明したものを見つけることができました。

答えて

7

docker-composeを名前付きボリュームマウントとDockerfileで使用して、その場所の内容を変更しようとしているようです。 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" 

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

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

+0

これは意味があります。私はそれが構成でどのように構築されるのか少し混乱していました。サービスを起動するときに、指定されたボリュームをドッカーから作成する方法はありますか? 'docker-compose up' - > volのディレクトリをクリアし、ホストから最新のファイルをコピーしたいのですか? –

+0

Dockerが空のフォルダをチェックした後に起こるため、コンテナの開始時にディレクトリを削除することはできません。常にこれをコンテナの内容で初期化し、前のボリュームを削除しても構わないと思っているのであれば、本当にそれをボリュームとして必要とするかどうか尋ねる必要があります。 – BMitch

+0

あなたは正しいです。私の解決策は、ボリュームを一括して削除し、開発中にホストファイルからマウントすることです。私は複数のコンテナにコードを共有することを考えていたため、最初はボリュームがありましたが、実際にはそれを行うのは意味がありません。 –

1

同じ場所に何回もボリュームをマウントします。 初めてコンテナがホストファイルシステムにデータを格納します.2回目はホストファイルシステムのINTOコンテナからデータを上書きします。 削除ボリュームを使用すると、追加情報here

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

を得ることができますドッカー-コンファイル

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

をあなたからマウント

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

+0

ボリュームを何度もマウントしませんでした。ボリュームにホストファイルシステムをマウントすることで動作させることができます。私は何が起きているのかを理解していると思います。ビルド時に、ホストからのコンテンツがイメージにコピーされます。しかし、私は既存のデータを持つボリュームをマウントしているので、イメージにコピーされたファイルはシャドウされます。通常の 'mount'のように動作します。私は混乱したと思うのは、イメージが構築される前に 'マウント'が行われていると思っていたことです。これは間違っています。 –

関連する問題