Если я использую EXPOSE $PORT в файле Dockerfile, могу ли я отменить раскрытие порта при использовании `docker run`?

Я работаю над Dockerfile для веб-приложения, которое будет использовать nginx-proxyконтейнер. У него также есть интерфейс командной строки для работы с доменом приложения (создание/изменение БД, запуск заданий очистки и т. д.).

В 99% случаев, когда я загружаю контейнер, я хочу использовать веб-приложение. У меня есть EXPOSE 3000 в Dockerfile, и он отлично работает для NGINX-proxy. Nginx-proxy использует docker-gen, который отслеживает события start и stop докера и перестраивает Конфигурация NGINX на основе открытых портов.

Проблема возникает, когда я хочу запустить контейнер на основе CLI. Я не хочу EXPOSE 3000. Я хочу отключить порт 3000, чтобы NGINX-прокси не менял конфигурации NGINX.

Это возможно с docker run? Чтение документов не дало ясности, а попытка docker run -p '' не сработала (я получил ошибку docker: No port specified: ::<empty>.).

Честно говоря, это немного придирка, и это не так уж важно. Я могу взять EXPOSE 3000 из Dockerfile и просто выполнить -p 3000 в командной строке. Мне просто нравится иметь его в Dockerfile, поэтому он включен по умолчанию, и мне просто нужно отключить его в нескольких случаях, когда он мне понадобится.

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

Мне просто любопытно, можно ли отменить публикацию порта, выставленного в Dockerfile, когда я делаю docker run (или, возможно, в docker-compose).


person JT.    schedule 04.11.2015    source источник


Ответы (2)


Насколько я знаю, сейчас это невозможно. Лучшее, что вы можете сделать, это также использовать параметр -P для сопоставления 3000 с каким-либо случайным портом, чтобы он не конфликтовал с основным экземпляром контейнера, например.

docker run -it -P <some-image>

Это приведет к следующему docker ps

main_container   0.0.0.0:3000->3000/tcp
run_container    0.0.0.0:32769->3000/tcp
person Dmitry Sokurenko    schedule 05.11.2015
comment
Круто, да. повторное сопоставление все равно вызовет проблемы. Однако за идею спасибо! - person JT.; 05.11.2015
comment
Я приму этот ответ через пару дней, если ни у кого больше нет умного обходного пути. Я также думаю, что ответ на вопрос, можно ли «открыть/опубликовать» порт, — «нет», основываясь на моем тестировании и прочтении документации. - person JT.; 05.11.2015

Даже спустя пару лет ситуация не сильно изменилась. Нет UNEXPOSE, но, по крайней мере, есть обходной путь с «docker save» и «docker load», позволяющий редактировать метаданные образа докера. По крайней мере, чтобы удалить тома и порты, я создал небольшой скрипт, который может автоматизировать задачу, см. docker-copyedit< /а>.

person Guido U. Draheim    schedule 29.04.2018