Использовать несколько портов в многоступенчатой сборке Docker

#docker #selenium #nginx #dockerfile #docker-machine

#docker #selenium #nginx #dockerfile #докер-машина

Вопрос:

Я использую многоступенчатую в docker для выполнения тестовых задач. Базовым образом является Selenium, который предоставляет порт 4444, а промежуточным образом является nginx для других операций.

В nginx открыт порт 80. Если мне нужно предоставить доступ к обоим портам, будет доступен только порт80, а не 4444 при использовании

 docker run -p 80:80 -p 4444:4444 someimage:2
  

Dockerfile:

 FROM selenium/standalone-firefox AS base
RUN python3 try.py

FROM nginx:alpine
COPY --from=base /report.html /usr/share/nginx/html
  

Ответ №1:

Вы неправильно понимаете, как работает многоступенчатая сборка.

Ваш конечный образ НЕ содержит все из каждого изображения, указанного вами в вашем Dockerfile.

Он ДЕЙСТВИТЕЛЬНО содержит все из изображения, указанного в последней FROM инструкции, и результаты всех приведенных ниже команд.

В вашем случае он содержит все из изображения nginx: последнюю версию и файл report.html скопировано с предыдущего этапа сборки — это означает, что когда вы используете его для запуска контейнера, на порту 4444 ничего не прослушивается, поэтому раскрывать его бессмысленно.

Комментарии:

1. Есть ли какой-либо другой способ добиться этого? В качестве обходного пути я установил nginx и настроил несколько портов

2. Вы можете создать пользовательский образ, содержащий как Selenium, так и nginx. Кроме этого — нет, нет способа объединить несколько образов Docker.