Один из полезных постов для тех, кто занимается #docker Хорошая статья про принципы построения Docker-файлов. Вкратце так:
- Используйте кэш по-максимуму и отделите установку зависимостей (редко изменяемые данные) от копирования остального кода (часто изменяемые данные).
- Всегда используйте конкретные тэги базовых образов (вместо latest/stable используйте тэг конкретной версии, например ubuntu:18.04.1)
- Используйте Multi-stage билды если нужно собрать код в одном окружении (например с gcc, make и прочими вкусностями), а для прода эти билд-инструменты не нужны. Собираем в одном базовом образе, а результат копируем в другой. Особенно это удобно в проектах Go: собрали бинарник, скопировали его в чистый alpine образ
- Для прода используйте только официальные базовые образы. Если какой-то чужой образ понравился – форкните на github, прочтите исходник, сбилдите у себя на машине и сохраните в свой registry
- Давайте бегущим в контейнерах программам минимум привелегий. Открывайте только нужные порты, не используйте по возможности —network=host и уж тем более —privileged! Саму программу в контейнере запускайте от имени непривилегированного пользователя. Лучше всего установите этому пользователю uid существующего локального пользователя, чью папку вы будете монтировать для сохранения данных.
Если пост был полезен — подписывайтесь!
https://www.docker.com/blog/speed-up-your-development-flow-with-these-dockerfile-best-practices/