Я пытаюсь настроить два образа Docker для моего веб-приложения PHP (php-fcm), обращенных прокси-сервером NGINX. В идеале я хотел бы, чтобы все файлы веб-приложения были скопированы в изображение на основе php-fcm и представлены в виде тома. Таким образом, оба контейнера (веб и приложение) могут получать доступ к файлам с помощью NGINX, обслуживающих статические файлы, и php-fcm интерпретирует файлы php.
докер-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
Опция «volume_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
Служебный контейнер для обновления вашего объема данных приложения может выглядеть примерно так:
docker run --rm -it \
-v `pwd`/new-app:/source -v app-data:/target \
busybox /bin/sh -c "tar -cC /source . | tar -xC /target"
Как указывает BMitch, обновления изображений автоматически не фильтруются в контейнеры. Ваш рабочий процесс для обновлений должен быть пересмотрен. Я только что прошел процесс создания контейнера, который включает в себя NGINX и PHP-FPM. Для меня я обнаружил, что лучшим способом было бы включить nginx и php в один контейнер, оба управляемые 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
Если вы хотите попробовать, просто форк https://github.com/CamW/centos-nginx-php-demo, измените файл conf / nginx.conf, как указано в файле readme, и включите ваш код.
Делая это таким образом, вам не нужно иметь дело с объемами вообще, все в вашем контейнере, что мне нравится.