Разница между Docker ENTRYPOINT и спецификацией контейнера Kubernetes COMMAND?

В Dockerfile есть параметр для ENTRYPOINT, и во время записи YAML файла развертывания Kubernetes в спецификации контейнера есть параметр для COMMAND.

Я не могу понять, в чем разница и как каждый используется?

Ответ 1

Kubernetes предоставляет нам множество опций о том, как использовать эти команды:

Когда вы переопределяете файл Entrypoint и Cmd в файле Kubernetes.yaml, применяются следующие правила:

  • Если вы не поставляете команду или args для контейнера, используются значения по умолчанию, определенные в изображении Docker.
  • Если вы поставляете команду, но нет аргументов для контейнера, используется только прилагаемая команда. По умолчанию EntryPoint и Cmd по умолчанию, определенные в изображении Docker, игнорируются.
  • Если вы поставляете только аргументы для контейнера, точка входа по умолчанию, определенная в изображении Docker, запускается с указанными вами аргументами.
  • Если вы укажете команду и аргументы, точка входа по умолчанию и Cmd по умолчанию, определенные в изображении Docker, будут проигнорированы. Ваша команда запускается с вашими аргументами.

Вот пример:

Dockerfile:

FROM alpine:latest
COPY "executable_file" /
ENTRYPOINT [ "./executable_file" ]

Файл Kubernetes yaml:

 spec:
    containers:
      - name: container_name
        image: image_name
        args: ["arg1", "arg2", "arg3"]

https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/

Ответ 2

Ключевое отличие заключается в терминологии. Кубернетес считал, что термины, которые Docker использовал для определения интерфейса с контейнером, были неуклюжими, и поэтому они использовали разные перекрывающиеся термины. Поскольку подавляющее большинство контейнеров оркестров Kubernetes являются Docker, путаница изобилует.

В частности, точки входа в docker - это команды kubernetes, а команды docker - в качестве аргументов kubernetes, как указано здесь: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes.

-------------------------------------------------------------------------------------
| Description                           | Docker field name | Kubernetes field name |
-------------------------------------------------------------------------------------
| The command run by the container      | Entrypoint        | command               |
| The arguments passed to the command   | Cmd               | args                  |
-------------------------------------------------------------------------------------

@Справочное описание того, как Kubernetes использует эти параметры времени выполнения, является правильным, но оно также корректно и то, как Docker Run использует их, если вы переводите термины. Ключ заключается в том, чтобы понять взаимодействие между образом и спецификациями прогонов в любой системе, а также переводить термины всякий раз, когда говорят о другой.