Ответ 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 - это может потребовать передать их в исходный репозиторий, если вы используете автоматическую сборку.