Получите переменные env с приложением Dockerized Vue в Dokku - PullRequest
3 голосов
/ 06 августа 2020

Я создал проект Vue, используя Docker (и Docker Compose), и нахожусь в процессе развертывания с помощью Dokku. Я настроил проект достаточно, чтобы его можно было успешно развернуть в производственной среде. Однако у меня возникают проблемы при попытке доступа к переменным среды в сценарии сборки Vue CLI. Из-за того, как работает Vue CLI, переменные среды по существу встроены в приложение во время сборки (а не во время выполнения). Это означает, что мне нужны переменные среды во время компиляции приложения, которыми я управляю в процессе производства Dockerfile.

Auth0 Dokku Guide было бесценным но не имел дело с передачей переменных среды из Dokku в Vue CLI при сборке (где я застрял). С Docker Compose (разработка) это легко, но Dockerfile (рабочий) кажется другим (с использованием и ARG, и ENV для каждой переменной).

# === Base stage =====
FROM node:12.2-alpine AS base
WORKDIR /app
# node_modules are managed inside the container
COPY package*.json ./

# === Dependency stage =====
FROM base AS dependencies
# Install ONLY production dependencies
RUN npm install --only=production
# Copy production dependencies aside
RUN cp -R node_modules prod_node_modules
# Install ALL dependencies
RUN npm install

# === Build stage =====
FROM dependencies AS build
# Copy the rest of the application
COPY . .

# NOTE: It appears to be necessary to use BOTH 'ARG' and 'ENV'?
ARG VUE_APP_API_URL
ENV VUE_APP_API_URL ${VUE_APP_API_URL}
# ...repeat for EVERY build variable necessary?

# Build the Vue application, outputting the static files to /dist
RUN npm run build

# === Release stage =====
FROM base AS release
# Copy production dependencies (overwriting all dependencies, used for building)
COPY --from=dependencies /app/prod_node_modules ./node_modules
# Copy the build artifacts from the build stage
COPY --from=build /app/dist ./dist
# Copy the simple server file
COPY server.js /app/server.js
EXPOSE 8080
CMD node server.js

Ключевой частью является использование ARG и ENV ... нет лучшего способа, чем повторить это для каждой переменной, используемой в процессе сборки Vue (ie. файл конфигурации приложения)?

# NOTE: It appears to be necessary to use BOTH 'ARG' and 'ENV'?
ARG VUE_APP_API_URL
ENV VUE_APP_API_URL ${VUE_APP_API_URL}
# ...repeat for EVERY build variable necessary?

Приложение успешно построено и правильно развернуто в небольшом Express контейнере сервера. Переменные среды заполняются при сборке Vue CLI при использовании вышеуказанной настройки файла Dockerfile. Я использую файл config.js в проекте Vue, чтобы получить переменные среды во время сборки. Обратите внимание на правильное использование префиксов переменных VUE_APP_ (требуется Vue CLI).

export default {
  api: {
    url: process.env.VUE_APP_API_URL,
  },
  app: {
    envName: process.env.VUE_APP_ENV_NAME || "local",
    isProduction: process.env.NODE_ENV === "production",
  },
};

Я попытался добавить необходимые переменные среды как переменные Dokku config, так и docker-options. Я немного запутался в Dokku docs о переменных конфигурации времени сборки. Относится ли это к переменным, используемым исключительно в Dockerfile, или к переменным, по существу предоставленным как process.env?

# Set Dokku environment variables (NOT USED)
dokku config:set [app_name] VUE_APP_API_URL=https://api.example.org

# Set Docker build variable (USED WITH ARG/ENV)
dokku docker-options:add [app_name] build "--build-arg VUE_APP_API_URL=https://api.example.org"

Должен быть лучший способ передать переменные среды, а не занимать так много строк ( и этапы) в Dockerfile!

TL; DR: Есть ли лучший способ передать переменные среды из Dokku в сценарий сборки Vue CLI при сборке с Dockerfile? Кажется безумием обновлять рабочий Dockerfile с таким количеством объявлений ARG и ENV, а затем по-прежнему устанавливать каждое из них индивидуально в dokku docker-options с этим многословным синтаксисом!

TL; DR2: Почему он не работает с dokku config, поскольку я не использую переменные времени сборки, но Vue CLI использует текущие переменные среды для сборки приложения? Почему Vue CLI использует переменные dokku config при построении?

1 Ответ

2 голосов
/ 29 августа 2020

Нет лучшего способа передать эти переменные во время сборки (docker build). Это сделано намеренно, так как docker изображения не должны содержать секретов.

Во всяком случае, было бы неплохо переместить эту конфигурацию в файл, который создается при запуске приложения, после чего он будет runtime config (docker run).

Это основано на лучших практиках Dockerfile, как показано здесь .

Может быть хорошим запросом функции для включения настройки все переменные конфигурации как аргументы сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...