Я разработал SPA с Vue.js, используя Vue-cli.Vue-cli настраивает веб-пакет для создания веб-приложения в среде dev и prod.В основном связывает все файлы шаблонов .vue и собирает связки index.html + js.Связывание выполняется по пути 'require' (или импорту в синтаксисе ES6) между зависимыми файлами: это означает, что, если, например, я сделаю:
import config from '@/conf/config.json'
let res = await Axios.get (config.API_ROOT + '/hello')
, он создаст файлы комплекта, которые содержатпредыдущий код, а также содержимое src / conf / config.json.
Это в принципе неплохо, но сейчас я покажу вам проблему:
Предположим, что вы создаетеизображение докера для обслуживания вашего спа-центра с помощью веб-сервера nginx.Вы хотите изменить параметры конфигурации без подключения тома (очень болезненно для инфраструктуры kubernetes), поэтому вы решили использовать переменные среды.Dockerfile будет выглядеть так
FROM some/node:image AS build
COPY . /dir
COPY package*.json /dir
RUN npm i
RUN npm run build
FROM some/nginx:image
COPY --from=build /dir/dist /usr/share/nginx/html
CMD /usr/share/nginx/html/static/config.json.template < envsubst > /usr/share/nginx/html/static/config.json && nginx -g "daemon off;"
, а файл config.json будет выглядеть как
{
API_ROOT : "$ENV_API_ROOT
}
, поэтому я создам шаблон config.json, который будет скомпилирован с envsubst при запуске контейнера.Я могу создать и использовать один и тот же образ в каждой среде, ожидаемой в моей инфраструктуре, мне просто нужно написать правильные значения для переменных env!
Единственная хитрость в том, что я все еще могу требовать / импортировать этот файл в остальной части кодовой базы.Это означает, что когда я запускаю «npm run build», веб-пакет должен выбрать его в каталоге хорошо знакомых (можно ссылаться на шаблон «@ / x / y / etc») и скопировать его в «статический» каталог без упаковки (в противном случае яне знаю, в каком файле запустить envsubst) и обновить все ссылки на файл
Я провел расширенный поиск, но не нашел ничего действительно полезного.Есть ли кто-нибудь, кто имеет опыт в этом вопросе?
Спасибо!