Якщо ви працюєте з 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 файлах :)
Ще немає коментарів