Избегайте выполнения команд git
или ssh
в Dockerfile. Поскольку у вас уже есть Makefile, клонировать репозиторий в среде сборки хоста очень просто:
# (not .PHONY, this actually creates the file)
some_dependency/some_file:
git clone git@github.com:some_organization/some_dependency
build-image: some_dependency/some_file
docker build --tag image:latest -f ./docker/Dockerfile .
Вам следует избегать запуска ssh
, поскольку в принципе невозможно безопасно управлять закрытыми ключами. В вашем примере любой, кто получит копию вашего изображения, может тривиально
docker run --rm image:latest cat .ssh/id_rsa
, и теперь ваш закрытый ключ скомпрометирован.
Аргумент против git clone
в Dockerfile немного больше тонкий. Кэширование слоя Docker означает, что он попытается избежать повторного запуска уже запущенной команды. Это означает, что если вы уже создали этот образ на этом хосте, повторный запуск docker build
будет использовать ту же проверку, что и раньше; он не будет повторять git clone
, и вы застрянете на старой версии. Это также означает, что построение одного и того же образа на разных хостах может давать разные результаты, в зависимости от того, когда он был создан в первый раз.
В контексте частного репозитория, над которым работают ваши коллеги, также рассмотрите случаи где вам нужно создать тестовый образ на основе запроса извлечения или другой ветви, или где вам действительно нужно протестировать локальное изменение на основе этой зависимости. git clone
в Dockerfile, работающем специально для master
, встанет у вас на пути; клонирование репозитория на хосте позволяет оба этих случая.