Dockerfile больше похож на скрипт оболочки, чем на скомпилированную программу.Docker читает каждую строку, выполняет действия, описанные в этой строке, и создает новый слой.
Такая настройка очень разумна:
# I am "node", a node.js base image:
FROM ubuntu:18.04
RUN apt-get blah blah install nodejs
# By default on this base image just run "node"
CMD ["node"]
# I am an application-specific image based on node.js
FROM node
COPY ...
# Override that default CMD
CMD ["node", "./app.js"]
В этой настройке естьдва слоя CMD в конечном изображении, и это нормально.
Я не сразу вижу запрос функции на этот счет в https://github.com/moby/moby/issues, но, если бы я был автором Докера, это кажется разумнымдостаточно «предупреждающего» типа сообщения, и, вероятно, не так уж и сложно составить для него запрос на извлечение.(Сохраните флаг, который запоминает, если вы видели CMD; если вы видите шаг CMD, предупредите, если установлен флаг, и установите его, если нет; если вы видите шаг FROM, сбросьте флаг.)