Недавно я начал использовать Buildkit, чтобы скрыть некоторые переменные env, и это отлично сработало в prod by gha!
Мой Dockerfile теперь выглядит примерно так:
# syntax=docker/dockerfile:1.2
...
RUN --mount=type=secret,id=my_secret,uid=1000 \
MY_SECRET=$(cat /run/secrets/my_secret) \
&& export MY_SECRET
И мой фронт был примерно таким:
DOCKER_BUILDKIT=1 docker build \
--secret id=my_secret,env="MY_SECRET"
И когда я запускаю это в своих действиях на Github, все работает отлично.
Но теперь эта проблема здесь, когда я пытаюсь собрать его локально. При выполнении docker-compose build
не получается. Конечно, потому что я не разглашаю никаких секретов, поэтому мой бэкэнд (Dockerfile) не сможет прочитать его из run/secrets/
.
Что я пытался сделать до сих пор, чтобы выполнить локальную сборку с помощью docker-compose build
:
1. Работа с секретами Docker:
Я в основном пытался сделать:
$ docker swarm init
$ echo "my_secret_value" docker secret create my_secret -
Я думал, что сохранение секрета решит проблему, но не сработало. Я все еще получаю то же сообщение об ошибке:
cat: can't open '/run/secrets/my_secret': No such file or directory
version: '3'
services:
app:
build:
context: "."
args:
- "MY_SECRET"
secrets:
- my_secret
secrets:
my_secret:
external: true
version: '3'
services:
app:
build:
context: "."
args:
- "MY_SECRET"
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
args:
- secret=id=my_secret,src=./my_secret.txt
Но все равно получил ту же ошибку:
cat: can't open '/run/secrets/my_secret': No such file or directory
Что я делаю неправильно, чтобы успешно выполнить docker-compose build
?
Я знаю, что могу легко использовать два Dockerfile, Dockerfile для локальной сборки и Dockerfile для сборки в prod, но я просто хочу использовать Buildkit как есть, только изменив свой файл docker-compose.yml
.
Кто-нибудь знает, чего мне не хватает, чтобы иметь возможность локально читать из /run/secrets/
?
Поддержка этого была недавно реализована в v2. См. приведенные ниже запросы на включение.
Предоставленный пример выглядит следующим образом:
services:
frontend:
build:
context: .
secrets:
- server-certificate
secrets:
server-certificate:
file: ./server.cert
Итак, вы близки, но вам нужно добавить секретный ключ под ключ сборки.
Также имейте в виду, что вы должны использовать docker compose
вместо docker-compose
, чтобы использовать v2, встроенный в клиент докера.
Мой рабочий стол докера говорит, что моя версия для компоновки 1.29.2
@JonatanLavado, это функция компоновки v2. Используйте команду сборки docker compose
, а не docker-compose
, которая является пакетом Python. У меня работает с Docker Compose version v2.5.0
Я только что обновил свой рабочий стол докера, и, похоже, он работает. Я дам Вам знать. Но небольшой вопрос: знаете ли вы, можно ли передать экспортированную переменную в свойство secrets? Мой секрет сохранен локально с помощью $ export VAR
. Есть ли свойство для его определения без использования файла?
Эй, я на самом деле также попробовал это из версии
3.8
и не работает, получил ошибку:services.app.build contains unsupported option: 'secrets'
Что мне нужно сделать, чтобы это заработало?