Docker - CMD vs ENTRYPOINT

Docker - CMD vs ENTRYPOINT
Переклад 4 хв. читання
10 вересня 2023

Якщо ви працюєте з Docker, ви будете писати Docker-файли. Коли ви пишете докер-файли, ви також повинні бути знайомі з такими командами, як CMD та ENTRYPOINT! Але коли слід використовувати CMD? І коли краще використовувати ENTRYPOINT? І, що важливіше, чим вони відрізняються?

Навіщо використовувати CMD або ENTRYPOINT

Інструкції CMD та ENTRYPOINT використовуються для вказівки того, як має працювати контейнер під час запуску.

Вони визначають поведінку Docker-програми за замовчуванням під час запуску.

Однак, якщо їх протиставити, то кожна інструкція працює по-різному.

Що таке CMD докерфайлу?

Інструкція CMD визначає команду та аргументи за замовчуванням для запуску контейнера. Вона часто використовується для того, щоб вказати команду, яку користувач може легко замінити під час запуску контейнера.

Якщо користувач не вкаже команду під час запуску контейнера, буде виконано команду, вказану в інструкції CMD.

У Docker команда CMD має наступний синтаксис:

CMD ["executable","arg1","arg2",...]
# OR
CMD executable arg1 arg2 ...
У Docker-файлі виконується лише остання команда CMD! Тому записуйте її лише один раз в кінці файлу

Тут можна легко замінити частину, що виконується, на середовище виконання/компілятор, за допомогою якого ви хочете виконати програму, наприклад, python, go, npm тощо.

Після виконуваного файлу йде список аргументів. Він містить ім'я файлу вашої програми та будь-які додаткові аргументи CLI, які можуть знадобитися.

CMD ["python", "main.py", "first_argument", "second_argument", ...]
# OR
CMD python main.py first_argument second_argument ...

Але якщо у вас вже скомпільовано виконувану програму, команда CMD може мати такий вигляд:

CMD ["executable_program_name", "first_argument", "second_argument"]
Для того, щоб це спрацювало, ви повинні вже скомпілювати програму за допомогою інструкції RUN!

CMD є достатньо гнучкою

Ключовим моментом тут є те, що команда CMD може бути повністю замінена під час виконання, тобто ви можете запустити контейнер з різними аргументами за допомогою команди запуску докера:

docker run <image_name> newarg1 newarg2 ...

Частина newarg1 newarg2 ... повністю замінює інструкцію CMD!

Використовуйте CMD, якщо вам потрібна гнучкість у командах запуску контейнера

Що таке ENTRYPOINT в докер-файлі?

ENTRYPOINT - це також інструкція для визначення команд за замовчуванням при запуску контейнера.

Синтаксис майже не відрізняється від CMD:

ENTRYPOINT ["executable","arg1","arg2",...]
# OR
ENTRYPOINT executable arg1 arg2 ...
# OR
ENTRYPOINT ["executable_program_name", "first_argument", "second_argument"]

Але є деякі відмінності...

ENTRYPOINT не є гнучким

Інструкції ENTRYPOINT не можуть бути перевизначені під час запуску контейнера, а це означає, що будь-які аргументи, вказані раніше у команді запуску докера, не працюватимуть. Натомість аргументи ENTRYPOINT будуть виконуватися завжди.

Вони фіксуються для контейнера під час створення образу.

Без жодних змін!

Використовуйте ENTRYPOINT, якщо вам не потрібні змінні аргументи запуску

Чи можуть ENTRYPOINT і CMD працювати разом?

Існує декілька способів співіснування інструкцій ENTRYPOINT та CMD у докер-файлах Один зі способів полягає у використанні ENTRYPOINT і CMD як часткових аргументів контейнера.

Використовуйте ENTRYPOINT для фіксованих аргументів. Якщо вам потрібно визначити базові аргументи, запишіть їх як інструкцію ENTRYPOINT. Використовуйте CMD для додаткових аргументів, які ви можете вказати пізніше. Сюди входять аргументи CLI, які ви хочете додати до базових аргументів. Оскільки вони містяться у команді CMD, їх можна змінити під час виконання. У такому разі докер-файл матиме приблизно такий вигляд:

# For clarity, include ENTRYPOINT and CMD as the last instructions

ENTRYPOINT ["python"]

CMD ["main.py", "argument_1", "argument_2"]

Ці дві команди об'єднуються в наступну команду:

CMD ["python" ,"main.py", "argument_1", "argument_2"]

Тепер, якщо ви вирішите запустити у вашому контейнері іншу програму, ви можете просто вказати ці нові аргументи у команді запуску докера!

У цьому прикладі перед аргументами нової програми буде стояти python, тому обов'язково використовуйте програму на python!

Схожість та відмінності - CMD та ENTRYPOINT

Аспект CMD ENTRYPOINT
Призначення Визначає команду за замовчуванням та аргументи, які можна перевизначити під час виконання. Вказує основну команду, яка виконується при запуску контейнера, також може отримувати додаткові аргументи.
Перевизначення Команду та аргументи можна легко перевизначити, вказавши їх під час запуску контейнера. Вказана тут основна команда залишається незмінною, але під час запуску контейнера можна надавати додаткові аргументи.
Синтаксис аргументів Використовує формат масиву: CMD ["executable", "arg1", "arg2"] або у форматі рядка: CMD команда arg1 arg2 Також використовується формат масиву: ENTRYPOINT ["executable", "arg1", "arg2"] або у форматі рядка: ENTRYPOINT команда arg1 arg2
Найкращі практики Найкраще підходить для визначення поведінки за замовчуванням, особливо якщо ви хочете дозволити легке налаштування під час виконання контейнера. Найкраще підходить для вказання фіксованої основної команди, яка має виконуватися при кожному запуску контейнера, з необов'язковими додатковими аргументами.

Сподіваюся, вам сподобалося читання, і я щиро сподіваюся, що воно прояснило ситуацію з інструкціями CMD і ENTRYPOINT в Docker файлах :)

Джерело: Docker — CMD vs ENTRYPOINT
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація