У меня есть контейнер nginx отдельно от моего контейнера rails и хочу иметь возможность обслуживать предварительно скомпилированные активы из рельсов с контейнером nginx. Это звучит как работа для контейнера тома, но я смутился после того, как вам быстро нужно было изучить docker и бесконечно читать документацию. С кем-то приходилось сталкиваться с подобной ситуацией?
Совместное использование предварительно скомпилированных активов в контейнерах докеров
Ответ 1
У меня такая же проблема. Здесь я сейчас работаю:
Вариант 1: используйте одно изображение как для nginx, так и для приложения
Таким образом, я могу создать изображение один раз (с приложением, предварительно скомпилированными активами и nginx), а затем запустить два экземпляра: один запустил сервер приложений, а другой для интерфейса nginx:
docker build -t hello .
docker run --name hello-app hello rackup
docker run --name hello-web -p 80:80 --link hello-app:app hello nginx
Не очень, но очень легко настроить и обновить.
Вариант 2: использование общего тома и прекомпиляция активов в качестве задания
Общие тома не могут быть обновлены в процессе сборки, но могут обновляться экземпляром контейнера. Поэтому мы можем запустить нашу команду rake, чтобы предварительно скомпилировать активы непосредственно перед запуском нашего приложения:
docker build -t hello .
docker run -v /apps/hello/assets:/app/public/assets hello rake assets:precompile
docker run --name hello-app hello rackup
docker run --name hello-web -p 80:80 --link hello-app:app -v /apps/hello/assets:/usr/share/nginx/html/assets nginx
Это выглядит как более надежный вариант, но потребует более сложного инструментария. Однако я склоняюсь к этому варианту, так как в любом случае нам понадобится отдельное задание для миграции базы данных.
Вариант 3: распределение активов на CDN во время сборки
Ваш Dockerfile может загружать полученные активы непосредственно в CDN. Затем вы настраиваете приложение Rails, чтобы использовать его как asset_host
. Что-то вроде:
RUN rake assets:precompile && aws s3 sync public/assets s3://test-assets/
Я сейчас экспериментирую с этой опцией. Поскольку я использую Amazon CloudFront, похоже, что я могу просто синхронизировать полученные активы с S3 с помощью AWS CLI. Там также есть драгоценный камень (asset_sync), но он выглядит устаревшим.
Недостатком является то, что вам нужно будет отправить необходимые учетные данные AWS в контекст сборки или сам файл Dockerfile - это может потребовать передать их в исходный репозиторий, если вы используете автоматическую сборку.
Ответ 2
Я рекомендую предварительно скомпилировать активы внутри контейнера Docker, потому что в этом случае вы можете без проблем запускать его в любую среду, иначе перед запуском контейнера докеров вы должны скопировать общие предварительно скомпилированные ресурсы в новую среду, смонтировать их и только после запуска контейнера докеров.
Другая проблема, связанная с версией активов. Я имею в виду, что ваш код должен использовать совместимые с ним активы, иначе у вас будут разные проблемы с CSS и JS. Итак, это второй момент, почему вы должны предварительно скомпилировать активы внутри контейнера Docker.
Ответ 3
Для производства @maxd прав: вы должны добавить скомпилированные активы к своим изображениям. Однако для развития я думаю, что вы правы. Используйте контейнер тома, который используется:
- контейнер рельсов для хранения предварительно скомпилированных активов
- контейнер nginx для обслуживания активов
Альтернативой будет установка каталога хоста в контейнеры.
Дополнительную информацию можно найти в "Руководство пользователя в контейнере" .
Ответ 4
Определить VOLUME в файле Docker
И затем используйте --volumes-from во время запуска другого контейнера