Хотя сам ARG
не будет сохраняться в построенном образе, когда вы ссылаетесь на переменную ARG
где-то в Dockerfile, это будет в истории:
FROM busybox
ARG SECRET
RUN set -uex; \
echo "$SECRET" > /root/.ssh/id_rsa; \
do_deploy_work; \
rm /root/.ssh/id_rsa
Как отмечает VonC, теперь есть функция роя для хранения секретов и управления ими, но это (пока) не решает проблему времени сборки. .
Строит
Выход в Docker ~ 1.14 (или любое другое эквивалентное название новой версии) должен быть отмечен флагом --build-secret
a> (также #28079), который позволяет монтировать секретный файл во время сборки.
В то же время, одно из решений состоит в том, чтобы запустить сетевую службу где-нибудь, где вы можете использовать клиента для извлечения секретов во время сборки. Затем, если сборка помещает секрет в файл, например ~/.ssh/id_rsa
, файл необходимо удалить до завершения шага RUN
, на котором он был создан.
Самое простое решение, которое я видел, это обслуживание файла с nc
:
docker network create build
docker run --name=secret \
--net=build \
--detach \
-v ~/.ssh/id_rsa:/id_rsa \
busybox \
sh -c 'nc -lp 8000 < /id_rsa'
docker build --network=build .
Затем соберите секрет, сохраните его, используйте и удалите на шаге Dockerfile RUN
.
FROM busybox
RUN set -uex; \
nc secret 8000 > /id_rsa; \
cat /id_rsa; \
rm /id_rsa
Проекты
Существует ряд утилит, которые имеют ту же самую предпосылку, но с различными уровнями сложности/функций. Некоторые из них являются универсальными решениями, такими как Hashicorps Vault.
16.03.2017