Про билд-секреты в докере
Давно хотел написать. Вот есть задача закинуть секреты в
Как тут правильно поступить?
1 Вытягивать секреты из секретницы в самом билде — не всегда возможно;
2 Multi-stage билд — может существенно замедлить сборку;
3 Закинуть секреты через встроенный механизм докера!
Как оно работает. Создаём файл с секретами. Например,
Включаем BuildKit через env DOCKER_BUILDKIT=1.
Скармливаем файл с секретами:
В Dockerfile монтируем секреты в RUN и загоняем их в env
Давно хотел написать. Вот есть задача закинуть секреты в
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 но это мне кажется наименее удобным.