Давно хотел написать. Вот есть задача закинуть секреты в
docker build. Это не рантайм-секреты, это секреты необходимые только на этапе билда. В итоговом образе они светиться не должны (как и любые секреты).Как тут правильно поступить?
--build-arg (ARG в Dockerfile) не подходит для передачи секретов, запомните это. Достаточно docker history --no-trunc <img> и вот они, секреты, как на ладони. Значит, какие у нас варианты:1 Вытягивать секреты из секретницы в самом билде — не всегда возможно;
2 Multi-stage билд — может существенно замедлить сборку;
3 Закинуть секреты через встроенный механизм докера!
Как оно работает. Создаём файл с секретами. Например,
.secrets. Обычный текстовый файл, куда мы закинем секреты строчка за строчкой.
cat <<EOT > .secrets
SUPER_SECRET_1=$SUPER_SECRET_1
SUPER_SECRET_2=$SUPER_SECRET_2
EOT
Включаем BuildKit через env DOCKER_BUILDKIT=1.
Если у ваc Docker >= 23.0 то BuildKit включен по умолчанию.Скармливаем файл с секретами:
DOCKER_BUILDKIT=1 docker build --secret id=secrets,src=.secrets .
В Dockerfile монтируем секреты в RUN и загоняем их в env
RUN --mount=type=secret,required=true,id=secret,target=./.secrets \
export $(cat .secrets) > /dev/null && \
npm run build
Можно не только через файл, но и через ENV но это мне кажется наименее удобным.