Сборка Docker с использованием секретов

Я пытаюсь внедрить переменную 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)

Такое ощущение, что токен вообще не зашифрован. Кто-нибудь получил ответ?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы используете секретное значение только на шаге 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 \
  .

Спасибо за инструкции. Да, SENTRY_AUTH_TOKEN следует использовать только в процессе сборки для загрузки исходных карт, поэтому я не хочу использовать передачу аргумента, поскольку он может встроиться в изображение. Следуя вашим инструкциям и обновлениям моего файла докера, я получил ошибку 401. Я чувствую, что токен читается неправильно. Я пытаюсь зарегистрировать то, что передается как SENTRY_AUTH_TOKEN через bash. Я попробовал использовать RUN echo cat /run/secrets/SENTRY_AUTH_TOKEN, но ничего не получилось. Я предполагаю, что это действительно секрет

Yuvi 23.04.2024 20:26

Файл /run/secrets/... существует только в конкретной команде RUN с опцией --mount=type=secret. Если вы попытаетесь установить переменную среды в этой команде RUN, она потеряется в конце команды RUN.

David Maze 23.04.2024 20:46

Я все еще получаю авторизованную ошибку. 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)

Yuvi 24.04.2024 14:16
Learn.microsoft.com/en-us/azure/devops/pipelines/process/… немного почитал и выглядит правильно, отображая значение как env
Yuvi 24.04.2024 14:18

у меня это работает. Используйте обновление файла докера @DavidMaze, и сценарий конвейера Azure должен docker buildx build -f dockerfile.prod --secret id=SENTRY_AUTH_TOKEN -t $(IMAGE_ID) --progress plain . передать секретную переменную как env.

Yuvi 24.04.2024 14:40

Другие вопросы по теме