2016-06-13 4 views
0

NGINX가 프록시 한 PHP 웹 응용 프로그램 (php-fcm)에 대한 두 개의 Docker 이미지를 설정하려고합니다. 이상적으로는 웹 응용 프로그램의 모든 파일을 php-fcm 기반 이미지로 복사하고 볼륨으로 표시하는 것이 좋습니다. 이 방법으로 두 컨테이너 (웹 및 응용 프로그램)는 정적 파일을 제공하는 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 

위의 설정이 작동합니다. 그러나 파일을 변경 한 다음 수행 할 때

결과 파일에서 새 파일이 선택되지 않습니다. 이는 실제로 이미지가 다시 빌드되고 있음을 나타내는 다음 메시지에도 불구하고 나타납니다.

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'옵션은 한 컨테이너에서 다른 컨테이너로 볼륨을 마운트합니다. 중요한 단어는 컨테이너가 아니라 이미지입니다. 따라서 이미지를 다시 빌드하면 이전 컨테이너가 여전히 실행 중입니다. 해당 컨테이너를 중지했다가 다시 시작하거나 중지하더라도 다른 컨테이너는 여전히 이전 마운트 지점을 사용하고 있습니다. 중지하고 이전 응용 프로그램 컨테이너를 제거한 다음 새 응용 프로그램 컨테이너를 시작하면 이전 볼륨 마운트는 지금 삭제 된 컨테이너에 계속 유지됩니다.

상황에 따라이를 해결하는 더 좋은 방법은 명명 된 볼륨으로 전환하고이 볼륨을 업데이트하는 유틸리티 컨테이너를 설정하는 것입니다.

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

감사합니다. 실제로 이것이 근본 원인입니다.나는 결국 두 부분 (정적 및 응용)에서 데이터를 분리하고 각각의 이미지에서 복사하기로 결정했습니다. 어쨌든 나중에 다른 서버에서 두 서버를 모두 실행하려는 경우가 있습니다. – chrisvdb

1

을, 이미지 업데이트가 자동으로 용기에 아래로 필터링하지 않습니다. 업데이트 워크 플로를 다시 방문해야합니다. 나는 방금 NGINX와 PHP-FPM을 포함하는 컨테이너를 만드는 과정을 겪었다. 가장 좋은 방법은 nginx와 php를 하나의 컨테이너에 포함시키는 것이 었습니다. 둘 다 supervisord가 관리했습니다. 그런 다음 git repo에서 코드를 업데이트 할 수있는 스크립트가 있습니다. 이것은 전체 프로세스를 정말 쉽게 만듭니다.

#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의 conf의/nginx.conf 파일을 변경, https://github.com/CamW/centos-nginx-php

에서 구할 수 있습니다 readme에 표시된대로 코드를 포함하십시오.

이렇게하면 볼륨을 전혀 다룰 필요가 없습니다. 모든 것은 내가 좋아하는 컨테이너에 있습니다.

+0

공유 주셔서 감사합니다. 시도해 볼게요! – chrisvdb