Я пытаюсь внедрить переменную Azure в env файла Docker, но получаю сообщение об ошибке, указывающее, что токен недействителен. Когда я жестко кодирую токен, он работает нормально.
# 1. Install dependencies only when needed
FROM node:20-alpine AS base
RUN --mount=type=secret,id=SENTRY_AUTH_TOKEN \
SENTRY_AUTH_TOKEN=$(cat /run/secrets/SENTRY_AUTH_TOKEN)
# 2. Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY . .
RUN yarn install --frozen-lockfile
ENV NODE_ENV=production
ENV NEXT_PUBLIC_SENTRY_DSN = "{{NEXT_PUBLIC_SENTRY_DSN}}"
ENV NEXT_PUBLIC_SENTRY_LOGGING_ENABLED = "{{NEXT_PUBLIC_SENTRY_LOGGING_ENABLED}}"
ENV SENTRY_LOG_LEVEL=debug
ENV SENTRY_AUTH_TOKEN = "{{SENTRY_AUTH_TOKEN}}"
RUN yarn build
# 3. Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV USE_HTTPS=true
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./package.json
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/entrypoint.sh ./entrypoint.sh
COPY --from=builder --chown=nextjs:nodejs /app/next.config.js ./next.config.js
COPY --from=builder --chown=nextjs:nodejs /app/next-i18next.config.js ./next-i18next.config.js
RUN ["chmod", "755", "/app/entrypoint.sh"]
USER nextjs
EXPOSE 3000
ENV PORT 3000
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["node", "server.js"]
Токен хранится как секретная переменная Azure. Вот команда конвейера сборки для внедрения.
- script:
SENTRY_AUTH_TOKEN=SENTRY_AUTH_TOKEN docker buildx build -f
dockerfile.prod --secret id=SENTRY_AUTH_TOKEN -t $(IMAGE_ID)
--progress plain .
displayName: 'docker build'
env:
SENTRY_AUTH_TOKEN: $(SENTRY_AUTH_TOKEN)
Такое ощущение, что токен вообще не зашифрован. Кто-нибудь получил ответ?


Похоже, вы используете секретное значение только на шаге RUN yarn build. В этом случае вам нужна опция --mount=type=secret именно в этой конкретной строке RUN и нигде больше. Вам не нужно устанавливать переменную как ENV.
FROM node:20-alpine AS base
# empty
FROM base AS builder
...
RUN --mount=type=secret,id=SENTRY_AUTH_TOKEN \
SENTRY_AUTH_TOKEN=$(cat /run/secrets/SENTRY_AUTH_TOKEN) \
yarn build
Помните, что все, что встроено в ваше изображение, довольно легко извлечь. Если токен встраивается в ваше браузерное приложение, он может присутствовать в конечном приложении в виде обычного текста и таким образом может обслуживаться в общедоступном Интернете. Это также может потребоваться для взаимодействия вашего внешнего приложения с внешней службой.
Если это приемлемо (или требуется), то, возможно, будет проще просто передать переменную как ARG. Это будет автоматически видно в среде RUN инструкций, и если оно присутствует в конечном изображении, то оно будет там доступно.
ARG SENTRY_AUTH_TOKEN
RUN yarn build
docker buildx build \
-f dockerfile.prod \
--build-arg SENTRY_AUTH_TOKEN=... \
-t $(IMAGE_ID) \
--progress plain \
.
Файл /run/secrets/... существует только в конкретной команде RUN с опцией --mount=type=secret. Если вы попытаетесь установить переменную среды в этой команде RUN, она потеряется в конце команды RUN.
Я все еще получаю авторизованную ошибку. Dockerfile работает правильно локально, когда я передаю секрет из такого файла docker build -f dockerfile.prod --secret id=SENTRY_AUTH_TOKEN,src=secrets -t ui:with-secrets ., но с конвейером Azure похоже, что он не читает его правильно. Я сохраняю auth_token как секретную переменную, так что моя команда Azure правильна bash docker buildx build -f dockerfile.prod --secret id=SENTRY_AUTH_TOKEN -t $(IMAGE_ID) --progress plain . env: SENTRY_AUTH_TOKEN: $(SENTRY_AUTH_TOKEN)
у меня это работает. Используйте обновление файла докера @DavidMaze, и сценарий конвейера Azure должен docker buildx build -f dockerfile.prod --secret id=SENTRY_AUTH_TOKEN -t $(IMAGE_ID) --progress plain . передать секретную переменную как env.
Спасибо за инструкции. Да, SENTRY_AUTH_TOKEN следует использовать только в процессе сборки для загрузки исходных карт, поэтому я не хочу использовать передачу аргумента, поскольку он может встроиться в изображение. Следуя вашим инструкциям и обновлениям моего файла докера, я получил ошибку 401. Я чувствую, что токен читается неправильно. Я пытаюсь зарегистрировать то, что передается как SENTRY_AUTH_TOKEN через bash. Я попробовал использовать
RUN echo cat /run/secrets/SENTRY_AUTH_TOKEN, но ничего не получилось. Я предполагаю, что это действительно секрет