Операционная система - это больше, чем ядро; это ядро ПЛЮС тонна файлов в пользовательском пространстве. То есть такие вещи, как файлы в /bin
и /etc
и /usr/bin
и /lib
Когда вы запускаете контейнер, вашей программе обычно требуется вспомогательный код (разделяемые библиотеки, скрипты) для запуска.
Это не всегда требуется. Например, если вы используете go
для написания своей программы, вы можете не иметь ничего, кроме единственного файла
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}
$ go build hello.go
$ strip hello
Теперь ваш dockerfile может быть
FROM scratch
COPY hello /
CMD ["/hello"]
Тривиальный случай; это просто пример.
Но если вы попытаетесь запустить php
, знаете ли вы все зависимости? Иногда проще поставить минимальную копию общей ОС. Но это связано с некоторыми рисками безопасности.
(see also https://www.sweharris.org/post/2016-06-04-small-container/ )