Что отличается от Config и ContainerConfig проверки докеров?

Я использую docker inspect для получения информации об изображении. Я нахожу, что на выходе есть Config и ContainerConfig, и большинство значений одинаковы, кроме CMD.

На практике эффект Config вступает в силу. Я должен добавить cmd в команду run. $ docker run -it debian bash

Интересно, в чем разница между двумя элементами?

$ docker inspect debian
[
{
    "Id": "7abab0fd74f97b6b398a1aca68735c5be153d49922952f67e8696a2225e1d8e1",
    ......
    "ContainerConfig": {
        "Hostname": "e5c68db50333",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": null,
        "Cmd": [
            "/bin/sh",
            "-c",
            "#(nop) CMD [\"/bin/bash\"]"
        ],
        "Image": "d8bd0657b25f17eef81a3d52b53da5bda4de0cf5cca3dcafec277634ae4b38fb",
        "Volumes": null,
        "WorkingDir": "",
        "Entrypoint": null,
        "OnBuild": null,
        "Labels": {}
    },
    "Config": {
        "Hostname": "e5c68db50333",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": null,
        "Cmd": [
            "/bin/bash"
        ],
        "Image": "d8bd0657b25f17eef81a3d52b53da5bda4de0cf5cca3dcafec277634ae4b38fb",
        "Volumes": null,
        "WorkingDir": "",
        "Entrypoint": null,
        "OnBuild": null,
        "Labels": {}
    },
    ......
}
]

Ответы

Ответ 1

Как упоминалось в issue 18880, в отношении ContainerConfig:

То, что вы видите там, связано с историей создания образа.
Попробуйте запустить docker history ... на вашем изображении, и вы увидите полную историю.
Docker поместит команды Dockerfile в раздел CMD как способ отслеживания того, как был создан этот слой/контейнер.
Он действительно используется только для целей поиска кеша (внутренняя обработка докеров) и не предназначен для использования пользователем.

Это также видно в image/image.go как:

// ContainerConfig is the configuration of the container that is committed into the image
ContainerConfig container.Config `json:"container_config,omitempty"`

Например, issue 17780 иллюстрирует пустой ContainerConfig:

ContainerConfig изображения - это контейнер, из которого был создан образ.
В случае вашего изображения он не генерируется из контейнера, а из запуска docker import.