
Комментарии 8
В Дисклеймере 2. я ведь про тоже самое и пишу. Но тут еще важный момент:
JS и Python - их деплой давно уже не равен тому что нужно “скопировать исходники на сервер”, и на сервер не попадает ваш проект если вы этого сознательно не сделаете.
В JS туда идет output, next, dist и так далее. Это транспилированный минифицированный код, без исходной структуры. Это не “исходный код проекта”, а build-артефакты. Там вы не найдете привычных ваших исходных файлов pages components src.
Даже Python может деплоиться как wheel и zipapp. .pyc контейнер с entrypoint
без полноценного дерева проекта. Да, восстановить можно теоретически, но вы разве сможете такое поддерживать без reverse engineering?
И сделаю акцент еще раз. В статье я не утверждаю, что код нельзя достать (дисклеймер 2). Я не пишу что Docker это какая то защита и специалист бессилен. Я утверждаю что на сервере нет рабочего дерева проекта, и это решает практическую задачу доступа и сопровождения.
Вот если есть что написать по этому поводу было бы интересно узнать
Не очень понимаю, как это скрывает код от человека, имеющего доступ к серверу? К докерфайлу в вашем примере:
docker run --rm --entrypoint sh [образ_ваш] -c 'cd /app && find . -type f -print -exec cat {} ;'
И всё, весь код из всех файлов в stdout
То, что дерево лежит внутри контейнера мало чем отличается от того, чтобы положить его в папку .bro_dont_look_here_its_hidden_dir_bro
В целом, runner выполняется на произвольном сервере, расположенном в произвольном месте, хоть в контейнере, хоть без. Если к серверу кроме вас ни у кого нет доступа, то и увидеть даже бинарники никто не сможет. Я разворачивал такой сценарий: после пуша юзера, runner копирует репозиторий к себе, выполняет работу, делает фиксацию и отправку на GitLab/Github/Gitea результатов работы и логов.
Да так и думал что кто нибудь напишет, конечно Docker не является средством защиты кода от человека с root-доступом к серверу. Я это прямо указываю в статье. В дисклеймере 2
Смысл этого подхода не в «невозможности извлечения», а в том, что на сервере нет рабочего дерева проекта и репозитория. При multi-stage сборке в финальный образ попадают только артефакты (.output у Nuxt, dist, бинарники и т.п.), а не исходный код в привычном виде.
Да, конечно же контейнер можно экспортировать и получить файлы. Но это будут сборочные артефакты, а не удобный для сопровождения проект с исходниками, структурой и контекстом. То есть суть статьи показать что есть вариант сделать разграничение и не держать код всего проекта на сервере как есть.
Но спасибо что указали на этот важный момент. Важно еще раз поставить акцент в этой части.
«Проект» должен быть написан на компилируемом языке.
Например? Интересно было бы узнать о чем вы
Я не специалист во всех языках но кажется компилируемый язык сам по себе ничего принципиально не меняет. В большинстве современных стеков результат сборки — это унифицированные артефакты: бинарники, bundle’ы, байткод или сборочные output-директории. Они передаются и деплоятся одинаково — независимо от того, был ли исходный язык компилируемым или интерпретируемым.
Если вы знаете что то из иной реальности то поделитесь пожалуйста.
Ммммм, в смысле? Go, например.
Проекта на не компилируемом, интерпретируемом, языке (JavaScript, Python) поставляется в исходных кодах и "скрыть в докере" его, исходный код, не получится. Для "нормального специалиста", что в докере, что на диске - одно и то же.
В Дисклеймере 2. я ведь про тоже самое и пишу. Но тут еще важный момент:
JS и Python - их деплой давно уже не равен тому что нужно “скопировать исходники на сервер”, и на сервер не попадает ваш проект если вы этого сознательно не сделаете.
В JS туда идет output, next, dist и так далее. Это транспилированный минифицированный код, без исходной структуры. Это не “исходный код проекта”, а build-артефакты. Там вы не найдете привычных ваших исходных файлов pages components src.
Даже Python может деплоиться как wheel и zipapp. .pyc контейнер с entrypoint
без полноценного дерева проекта. Да, восстановить можно теоретически, но вы разве сможете такое поддерживать без reverse engineering?
И сделаю акцент еще раз. В статье я не утверждаю, что код нельзя достать (дисклеймер 2). Я не пишу что Docker это какая то защита и специалист бессилен. Я утверждаю что на сервере нет рабочего дерева проекта, и это решает практическую задачу доступа и сопровождения.
Вот если есть что написать по этому поводу было бы интересно узнать
Как не держать код на сервере