Пошук уроків, статей та іншого контенту
Дві інструкції Dockerfile, що визначають команду запуску контейнера, — і як вони доповнюють одна одну.
І CMD, і ENTRYPOINT задають команду, яку Docker виконує, коли контейнер запускається. Плутанина виникає тому, що поодинці вони поводяться майже однаково — різниця стає помітною, коли контейнер запускають із додатковими аргументами командного рядка.
FROM node:20
CMD ["node", "server.js"]Якщо запустити контейнер без додаткових аргументів — виконається node server.js. Але будь-яка команда, вказана при docker run, повністю замінює CMD:
docker run my-app npm test
# виконає "npm test", а НЕ "node server.js" — CMD повністю перевизначеноFROM node:20
ENTRYPOINT ["node", "server.js"]Аргументи, передані при docker run, тепер додаються до ENTRYPOINT, а не замінюють його:
docker run my-app --port=3001
# виконає "node server.js --port=3001"ENTRYPOINT задає незмінну програму, CMD — аргументи за замовчуванням до неї, які легко перевизначити при запуску:
FROM node:20
ENTRYPOINT ["node", "server.js"]
CMD ["--port=3000"]docker run my-app # node server.js --port=3000 (CMD за замовчуванням)
docker run my-app --port=8080 # node server.js --port=8080 (CMD перевизначено)Використання лише CMD там, де контейнер завжди має виконувати ту саму базову програму — випадковий аргумент при запуску повністю замінює команду, а не додається до неї.
Форма запису «shell» (CMD npm start) замість форми масиву (CMD ["npm", "start"]) — shell-форма запускає команду через /bin/sh -c, що додає зайвий проміжний процес і ускладнює коректну обробку сигналів зупинки контейнера.
CMD — аргументи за замовчуванням, які легко перевизначити повністю при запуску. ENTRYPOINT — основна команда, до якої аргументи запуску лише додаються. Поєднання ENTRYPOINT (незмінна програма) + CMD (аргументи за замовчуванням) — найгнучкіший і найпоширеніший патерн у реальних Dockerfile.