#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 ...