2016-08-04 9 views
5

私はDockerと少し違うことをするために働いている会社でdev opsから質問されています。ビルドを共有する名前付きドッカーのボリュームが更新されない

コンテナA: フロントエンド反応アプリケーションを構築し、そのバンドルをapp/dist/というディレクトリに配置するノードコンテナです。これが完了すると、コンテナの実行が停止します。

コンテナB: 静的ファイルをサーバにするalpine nginxコンテナ/usr/share/nginx/html/app

コンテナAに組み込まれたファイルは、<Container A>/app/dist<Container B>/usr/share/nginx/html/appをマウントするボリュームを使用してコンテナBに提供されます。

パブリックアクセス可能ポートとnginxコンテナの間には、appというコンテナであるHAProxyレイヤがあります。上記の次のようなドッキングウィンドウのコンポーズファイルを使用して編成されている

タスク:これは現在ドッキングウィンドウのコンファイルが構築されているのみで初めて取り組んでいる

version: '2' 
volumes: 
    webapp_build_volume: {} 
services: 
    webapp_build: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-builder' 
    volumes: 
     - webapp_build_volume:/app/dist 
     - webapp_static_volume:/app/src/app/static 
    app: 
    build: 
     context: 'config/haproxy' 
     dockerfile: 'dockerfile-app-haproxy' 
    links: 
     - web 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
    ports: 
     - '80:80' 
     - '1936:1936' 
    web: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-web' 
    environment: 
     - EXCLUDE_PORTS=443 
     - VIRTUAL_HOST=* 
    depends_on: 
     - webapp_build 
    volumes: 
     - webapp_build_volume:/usr/share/nginx/html/app 

。ボリュームが作成された後も、ボリューム内のファイルは更新されません。名前を付けられたボリュームは確立された後に更新できないが、これを確認することはできないということを読んだ。私はdocker-compose rm --force && docker volume webapp_build rmを実行することを含む回避策を見つけましたが、CIサービスが遅すぎる可能性があるので、キャッシュされたコンテナを強制終了する必要はありません。

何かを明確にすることができるかどうか教えてください(ここには多くの可動部分があります)。私はここでやったことがどう変わるか分かりませんが、ドッカー2のベータ版も使用しています。

答えて

4

これは少し難しいですが、イメージを構築していると思われるファイルを出力し、別の実行中のコンテナで使用されている名前付きボリュームを作成するためにそのファイルを使用しようとしています。

コンテナの構築ではボリュームがマウントされず、ボリュームは実行中のコンテナにのみマウントされます。名前付きボリュームには、イメージの内容によってデータが取り込まれる機能がありますが、空の名前付きボリュームをマウントした場合にのみ機能します。最初のビルド+実行でこの機能を利用しているようですが、将来のビルドでは再び機能しません。ボリュームなしでビルドコンテナを実行すると、ファイルが期待どおりに存在することがわかります。

名前付きボリュームを簡単に更新できます。 2つの選択肢があります。 1つは現在のプロセスを使用することですが、ボリュームマウントポイントを "/ target"のように変更し、ビルドコンテナのCMDとしてソースの内容を "/ target"にコピーします。

Dockerfile

... 
RUN compile-cmd --output-to /local/build/dir 

entrypoint.sh:

cp -a /local/build/dir/* /target/ 

ドッキングウィンドウ-コンそれはのようになります。YML:

version: '2' 
services: 
    webapp_build: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-builder' 
    volumes: 
     - webapp_build_volume:/target 
... 

を2番目のオプションは、すべてのコンテナのビルドでこれを行うのではなく、アプリケーションが前提条件をコンパイルすると、コンテナをしないことです。次に、コード・ボリュームの内容を取り込み、コンパイルしてマウントされた名前付きボリュームに出力するCMDまたはENTRYPOINTを使用して、アプリケーション・コードをボリュームとしてこのコンテナにマウントします。次に、ビルドコンテナをビルドする代わりに、2つのボリュームをマウントしてコンパイルコンテナを実行するだけです。

entrypoint.sh:

compile-cmd --input-src=/source --output-to /target 

ドッキングウィンドウ-compose.yml:

version: '2' 
services: 
    webapp_build: 
    volumes: 
     - app/source:/source 
     - webapp_build_volume:/target 
... 
+0

今ソリューション1をしようとしています。まもなくお知らせいたします! – Shawn

+0

ありがとうございます。あなたの最初の解決策がそこで働いた。なぜこれによってボリュームは更新されますが、ディレクトリへの構築は行われませんでしたか? – Shawn

+3

ディレクトリにビルドしましたが、ビルド中にボリュームがマウントされていませんでした。これは、コンテナを実行するときに発生します。実行中のコンテナにボリュームをマウントすると、Dockerはボリュームが空のときにイメージの内容をボリュームにコピーし、後でこのボリュームの初期化ステップは実行されません(そうしないと、 2番目のコンテナでボリュームを使用しようとしたときの内容)。 – BMitch

関連する問題