Про билд-секреты в докере



Давно хотел написать. Вот есть задача закинуть секреты в 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 но это мне кажется наименее удобным.