kotcich
@kotcich
Я скучный.

Как передать env переменные во время runtime SPA VITE приложения с докером (Ubuntu)?

По этой ссылке нашел решение данной проблемы. Но у меня на ubuntu не завелось.
На клиенте, все места где я вызываю env переменную это происходит так (опять же по гайду):
(import.meta.env.VITE_DOMAIN_NAME || "__DOMAIN_NAME__") # скобки используются, так как оно у меня часто оборачивается внутри какой то строки вот так, let result = str1 + (import.meta.env.VITE_DOMAIN_NAME || "__DOMAIN_NAME__") + str2

Dockerfile:
FROM docker.io/node:22.2.0-alpine AS build

ADD https://github.com/my_nickname/repo.git /app
WORKDIR /app

RUN npm install
RUN npm run build

FROM docker.io/nginx:1.26.2-alpine

COPY --from=build /app/dist /usr/share/nginx/html
COPY --from=build /app/external/nginx.conf /etc/nginx/conf.d/example.com.conf

WORKDIR /usr/share/nginx/html

# копирую env файл уже после билда, чтобы скрипт мог им воспользоваться
COPY ./frontend.env ./.env
ENV RUN_ENV=./entrypoint.sh
COPY ${RUN_ENV} ${RUN_ENV}
RUN chmod +x ${RUN_ENV}

EXPOSE 80
EXPOSE 443
ENTRYPOINT ["./entrypoint.sh"]

# Запускаю nginx в докерфайле, а не в баш-скрипте для ясности что и где происходит
CMD ["nginx", "-g", "daemon off;"]

Ну и сам баш скрипт:
#!/bin/sh
BUILD_DIR="/usr/share/nginx/html/assets"

get_env_value() {
    local VAR_NAME="$1"
    grep "^${VAR_NAME}=" .env | cut -d '=' -f 2-
}
while IFS= read -r line || [ -n "$line" ]; do
    if [[ $line != \#* ]]; then
        VAR_NAME=$(echo "$line" | cut -d '=' -f 1)
        VAR_VALUE=$(get_env_value "$VAR_NAME")
        if [ ! -z "${!VAR_NAME}" ]; then
            VAR_VALUE="${!VAR_NAME}"
        fi
        for file in $BUILD_DIR/*.js; do
            sed -i "s|__${VAR_NAME}__|${VAR_VALUE}|g" "$file"
        done
    fi
done < .env

Ну и выполнение docker-compose (build than run) приводит к:
1. Все ставится
2. Доходит до последней части, где срабатывает данный скрипт
3. Но в самом конце появляется:
frontend  | ./entrypoint.sh: line 19: syntax error: bad substitution
frontend exited with code 0

И docker compose фаталится.

Я зделал небольшую проверку, подумал что проблема именно в последней строчке скрипта, как и указано в ошибке, 19 строка. Добавил на 20 строку банальный ls. И ошибка стала такой:
frontend  | ./entrypoint.sh: line 20: syntax error: bad substitution

Эта команда просто не могла зафаталить, но ошибка сдивнулась на 20 строчку. Что видимо значит, что ошибка где то в скрипте, но отладка просто не может мне дать точную строку, что и где, и просто указывает мне номер последней строки скрипта и текст одной и той же ошибки.

Мой уровень понимания bash скриптов около нулевой (синтаксис), поэтому я даже не знаю за что браться. Может быть даже это будет работать на винде, но не на линуксе. Все таки этот гайд хорошо оценили. Поэтому уверен что дурак я, прошу помощи.
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
kotcich
@kotcich Автор вопроса
Я скучный.
Ответ: Saboteur

#!/usr/bin/bash
BUILD_DIR="/usr/share/nginx/html/assets"

while read line; do
  [ -z "$line" ] && continue
  [ "${line:0:1}" == "#" ] && continue
  VNAM="${line%=*}"
  VVAL="${line#*=}"
  [ -n "$VNAM" ] && sed -i "s|__${VNAM}__|${VVAL}|g" $BUILD_DIR/*.js
done < .env
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы