ОТОБРАЖЕНИЕ и CMD игнорируются при запуске сборки docker

#docker

Вопрос:

Я пытаюсь создать образ docker, запустив сборку docker . Ниже приведены коды в моем файле Dockerfile.

 FROM node

WORKDIR /app

COPY . /app

RUN npm install

EXPOSE 80

CMD ["node", "server.js"]
 

но я получил журнал только до команды ВЫПОЛНИТЬ:

  => [internal] load build definition from Dockerfile                                                                   0.1s 
 => => transferring dockerfile: 128B                                                                                   0.0s 
 => [internal] load .dockerignore                                                                                      0.0s 
 => => transferring context: 2B                                                                                        0.0s 
 => [internal] load metadata for docker.io/library/node:latest                                                         0.0s 
 => [1/4] FROM docker.io/library/node                                                                                  0.0s 
 => [internal] load build context                                                                                      0.1s 
 => => transferring context: 14.62kB                                                                                   0.0s 
 => CACHED [2/4] WORKDIR /app                                                                                          0.0s 
 => [3/4] COPY . /app                                                                                                  0.1s 
 => [4/4] RUN npm install                                                                                              5.0s 
 => exporting to image                                                                                                 0.3s 
 => => exporting layers                                                                                                0.2s 
 => => writing image sha256:b7949d3a83e365d0c55690d4fd5c6d9f0e0e20fe88c53aebc3e33b067e600231                           0.0s
 

Я ожидаю, что и EXPOSE, и CMD будут работать так же, как и остальные 4 строки.
Где я должен проверить, чтобы сделать это? Большое вам спасибо за вашу помощь!

Ответ №1:

EXPOSE на самом деле не публикует порт (выделено мое):

EXPOSE Инструкция сообщает докеру, что контейнер прослушивает указанные сетевые порты во время выполнения. Вы можете указать, прослушивает ли порт TCP или UDP, и по умолчанию используется TCP, если протокол не указан.

EXPOSE Инструкция фактически не публикует порт. Он функционирует как тип документации между человеком, создающим образ, и человеком, который запускает контейнер, о том, какие порты предназначены для публикации. Чтобы фактически опубликовать порт при запуске контейнера, используйте -p флаг вкл docker run .для публикации и сопоставления одного или нескольких портов или -P флаг для публикации всех открытых портов и сопоставления их с портами высокого порядка.

При запуске контейнера вы должны использовать эту -p опцию, чтобы фактически опубликовать и сопоставить порт. Например:

 docker run [params] -p 8080:9090 image
 

Ответ №2:

Buildkit ничего не регистрирует для этих шагов, даже если он все еще выполнял их. Скорее всего, они решили не регистрировать этот шаг, потому что не создается никаких изменений файловой системы, а корректируются только некоторые метаданные. Результатом раскрытия, CMD, наряду с другими шагами, такими как ТОЧКА ВХОДА, МЕТКА и ENV, является изменение конфигурации json изображения.

Эта конфигурация поставляется вместе с изображением и сообщает среде выполнения значения по умолчанию для запуска контейнера. Многие из этих значений по умолчанию могут быть переопределены при создании контейнера, например, команда и точка входа. И, в частности, для открытого порта, это документация о том, какие порты по умолчанию прослушиваются внутри контейнера.

Чтобы просмотреть выходные данные классического инструмента сборки, вы можете отключить buildkit, установив переменную среды:

 DOCKER_BUILDKIT=0 docker build ...