2016-06-13 62 views
0

NGINXによってプロキシされたPHP Webアプリケーション(php-fcm)用の2つのDockerイメージを設定しようとしています。理想的には、私は、Webアプリケーションのすべてのファイルをphp-fcmベースのイメージにコピーし、ボリュームとして公開したいと考えています。このようにして、両方のコンテナ(webとapp)は静的ファイルを処理するNGINXとphpファイルを解釈するphp-fcmでファイルにアクセスできます。再構築後にDockerイメージにファイルの変更が反映されない

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

version: '2' 
services: 
    web: 
    image: nginx:latest 
    depends_on: 
     - app 
    volumes: 
     - ./site.conf:/etc/nginx/conf.d/default.conf 
    volumes_from: 
     - app 
    links: 
     - app 
    app: 
    build: . 
    volumes: 
     - /app 

Dockerfile:

FROM php:fpm 
COPY . /app 
WORKDIR /app 

予想通り上記のセットアップが動作します。ただし、ファイルに変更を加えて実行すると、

compose up --build 

となります。新しいファイルは結果の画像には表示されません。これは、画像が実際に再構築されていることを示す次のメッセージにもかかわらず、次のとおりです。

Building app 
Step 1 : FROM php:fpm 
---> cb4faea80358 
Step 2 : COPY . /app 
---> Using cache 
---> 660ab4731bec 
Step 3 : WORKDIR /app 
---> Using cache 
---> d5b2e4fa97f2 
Successfully built d5b2e4fa97f2 

のみ削除するすべての古いイメージはトリックを行います。

何が原因なのでしょうか?

$ docker --version 
Docker version 1.11.2, build b9f10c9 
$ docker-compose --version 
docker-compose version 1.7.1, build 0a9ab35 

答えて

1

'volumes_from'オプションは、1つのコンテナから別のコンテナにボリュームをマウントします。重要な言葉はコンテナであり、イメージではありません。したがって、イメージを再構築すると、前のコンテナはまだ実行されています。そのコンテナを停止して再起動した場合、またはそれを停止するだけでも、他のコンテナはそれらの古いマウントポイントを引き続き使用しています。停止して古いアプリケーションコンテナを削除して新しいアプリケーションコンテナを開始すると、古いボリュームのマウントは今でも削除されたコンテナに残ります。

あなたの状況でこれを解決するより良い方法は、名前付きボリュームに切り替えて、このボリュームを更新するユーティリティコンテナをセットアップすることです。

version: '2' 
volumes: 
    app-data: 
    driver: local 

services: 
    web: 
    image: nginx:latest 
    depends_on: 
     - app 
    volumes: 
     - ./site.conf:/etc/nginx/conf.d/default.conf 
     - app-data:/app 
    app: 
    build: . 
    volumes: 
     - app-data:/app 

のようなものになりますあなたのアプリデータボリュームを更新するためのユーティリティコンテナ:BMitchが指摘するように

docker run --rm -it \ 
    -v `pwd`/new-app:/source -v app-data:/target \ 
    busybox /bin/sh -c "tar -cC /source . | tar -xC /target" 
+0

ありがとう、これは確かに根本的な原因です。私は最終的に2つの部分(静的とアプリ)でデータを分割し、それぞれの画像にコピーすることに決めました。これは後の段階で、いずれにしても両方のサーバーで両方を実行したいという意味になります。 – chrisvdb

1

を、画像の更新が自動的に容器にダウンフィルタリングしません。更新のワークフローを再訪する必要があります。私はちょうどNGINXとPHP-FPMを含むコンテナを構築するプロセスを完了しました。私は、私にとって、最良の方法はnginxとphpを1つのコンテナに含めることであり、どちらもsupervisordによって管理されていることがわかりました。 その後、gitリポジトリからコードを更新するためのスクリプトが画像にあります。これにより、プロセス全体が簡単になります。

#Create new container from image 
docker run -d --name=your_website -p 80:80 -p 443:443 camw/centos-nginx-php 
#git clone to get website code from git 
docker exec -ti your_website get https://www.github.com/user/your_repo.git 
#restart container so that nginx config changes take effect 
docker restart your_website 

#Then to update, after committing changes to git, you'll call 
docker exec -ti your_website update 
#restart container if there are nginx config changes 
docker restart your_website 

私のコンテナがhttps://hub.docker.com/r/camw/centos-nginx-php/ dockerfileで発見することができますし、あなたはそれを試してみることにしたい場合は関連付けられたビルドファイルは、ちょうどフォークhttps://github.com/CamW/centos-nginx-php-demo、研究会/ nginx.confファイルを変更し、https://github.com/CamW/centos-nginx-php

でご利用いただけますreadmeに示されているように、あなたのコードが含まれています。

このようにすると、ボリュームをまったく処理する必要はありません。すべてが私の好きなコンテナにあります。

+0

ありがとうございます。試してみましょう! – chrisvdb

関連する問題