Чем отличается CMD от ENTRYPOINT в DockerFile

В Dockerfile две важные инструкции, которые определяют, какой исполняемый файл будет запущен при старте контейнера, это `CMD` и `ENTRYPOINT`. Хотя обе инструкции выглядят похожими, между ними есть ключевые отличия в поведении и назначении.

Инструкция `CMD`

Задает команду и её аргументы по умолчанию, которые будут выполнены при запуске контейнера. Однако, если при запуске контейнера указаны любые другие команды, они заменят команду, заданную через него. Это делает его идеальным выбором для задания параметров по умолчанию, которые могут быть переопределены пользователем при запуске контейнера.

Пример:

```dockerfile
FROM ubuntu
CMD ["echo", "Hello, world!"]
```

При запуске этого контейнера без дополнительных параметров, будет выведено "Hello, world!". Но если при запуске указать другую команду, например `docker run <image> echo "Hello, Docker!"`, то будет выведено "Hello, Docker!".

Инструкция `ENTRYPOINT`

Конфигурирует контейнер так, что он будет запущен как исполняемый файл. Аргументы, указанные при запуске контейнера, передаются в него как дополнительные аргументы. Это означает, что команда, заданная в него, не заменяется, а дополняется аргументами, указанными при запуске контейнера.

Пример:

```dockerfile
FROM ubuntu
ENTRYPOINT ["echo", "Hello,"]
CMD ["world!"]
```

Здесь, если контейнер запущен без дополнительных аргументов, вывод будет "Hello, world!". Если же запустить контейнер с дополнительными аргументами, например `docker run <image> Docker`, то вывод будет "Hello, Docker".

Основные отличия

1. Переопределение команды: `CMD` может быть полностью переопределена при запуске контейнера, в то время как `ENTRYPOINT` предопределяет базовую команду, и любые аргументы, указанные при запуске, добавляются к этой команде.
2. Использование в комбинации: Часто `ENTRYPOINT` используется в комбинации с `CMD`, где `ENTRYPOINT` задает исполняемый файл, а `CMD` задает аргументы по умолчанию, которые могут быть переопределены при запуске.

`CMD` и `ENTRYPOINT` обе определяют, какая команда будет выполнена при запуске Docker-контейнера, но делают это по-разному. `CMD` лучше использовать для задания параметров по умолчанию, которые могут быть изменены, а `ENTRYPOINT` для установки фиксированной базовой команды, к которой можно добавлять аргументы.

April 17, 2024, easyoffer