core code helper

Чим відрізняється CMD від ENTRYPOINT у Dockerfile і коли що використовувати?

Поставити питання
Запитано Активність 14 переглядів Є найкраща відповідь
0

Пишу Dockerfile для образу з тестами (Playwright). Бачу в прикладах то CMD ["npx", "playwright", "test"], то ENTRYPOINT ["npx", "playwright"] разом з CMD ["test"]. Обидва варіанти начебто працюють.

У чому різниця і який підхід правильний, якщо я хочу іноді передавати свої аргументи, наприклад --grep @smoke?

Катерина Литвиненкозапитання · 19 серпня 2026 р.

1 відповідь

0
Найкраща відповідь — на думку автора питання

Коротко: ENTRYPOINT — що запускати, CMD — аргументи за замовчуванням.

Коли запускаєте docker run image <аргументи>, ці аргументи замінюють CMD, а ENTRYPOINT залишається.

ENTRYPOINT ["npx", "playwright", "test"]
CMD ["--reporter=line"]
docker run tests                       # npx playwright test --reporter=line
docker run tests --grep @smoke         # npx playwright test --grep @smoke

А якщо лише CMD:

CMD ["npx", "playwright", "test"]
docker run tests --grep @smoke         # ❌ спробує виконати команду "--grep"
docker run tests npx playwright test --grep @smoke   # треба писати все повністю

Для образу-«утиліти», який завжди запускає одну програму, ваш варіант — ENTRYPOINT + CMD. Для образу застосунку, куди іноді заходять з іншою командою (sh, міграції), зручніше один CMD.

І обов'язково використовуйте exec-форму (JSON-масив), а не shell-форму CMD npx playwright test. У shell-формі процес запускається як дочірній для /bin/sh -c і не отримує сигнал SIGTERM — контейнер не зупиняється коректно і через 10 секунд його вбивають.

Андрій Мельниквідповідь ·

Знаєте відповідь?

Увійдіть через Google — і зможете відповідати, голосувати й ставити власні питання. Це безкоштовно.

Увійти через Google