Подтвердить что ты не робот

Совместное использование предварительно скомпилированных активов в контейнерах докеров

У меня есть контейнер nginx отдельно от моего контейнера rails и хочу иметь возможность обслуживать предварительно скомпилированные активы из рельсов с контейнером nginx. Это звучит как работа для контейнера тома, но я смутился после того, как вам быстро нужно было изучить docker и бесконечно читать документацию. С кем-то приходилось сталкиваться с подобной ситуацией?

4b9b3361

Ответ 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 для обслуживания активов

Альтернативой будет установка каталога хоста в контейнеры.

Дополнительную информацию можно найти в "Руководство пользователя в контейнере" .