По этой
ссылке нашел решение данной проблемы. Но у меня на 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 скриптов около нулевой (синтаксис), поэтому я даже не знаю за что браться. Может быть даже это будет работать на винде, но не на линуксе. Все таки этот гайд хорошо оценили. Поэтому уверен что дурак я, прошу помощи.