Единая конфигурация открытых портов для образа Docker, Docker-Compose и вызова службы - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть файл docker-compose.yml, упрощенный ниже

slim-first:
  image: slim-image
  expose:
    - 9191

slim-second:
  image: slim-image
  expose:
    - 9192

Образ slim-image получен из Dockerfile, который запускает службу (используя среду PHP Slim) с помощью следующей команды

#File: Dockerfile

# ...

CMD ["/usr/local/bin/php", "-S", "0.0.0.0:9191", "-t", "/slim/public"]

Возможно, вы уже заметили проблему - мне нужно предоставить встроенному веб-серверу PHP порт. Тем не менее, я пытаюсь запустить две службы - каждая из которых доступна на своем порте.

Мой вопрос: есть ли в моем Dockerfile способ доступа к значениям порта expose d из моего файла docker-composer.yml?

Или это решение дублировать номер порта в переменную окружения, которую может видеть Dockerfile.

Или есть какой-то третий путь, который позволил бы мне настроить значение порта в одном и только одном месте?

Чтобы уточнить, я знаю, что мог бы сделать что-то вроде этого

slim-second:
  image: slim-image
  expose:
    - 9192
  args:
    - PORT=9192

...

ARG PORT=9191
CMD ["/usr/local/bin/php", "-S", "0.0.0.0:$PORT", "-t", "/slim/public"]

но я не хочу повторять порт дважды в моем файле docker-compose.yml.

1 Ответ

0 голосов
/ 01 ноября 2018

Неважно: вы можете запускать серверы в нескольких контейнерах, которые все прослушивают один и тот же порт, и сопоставлять их с разными опубликованными портами на хосте.

Я бы жестко запрограммировал порт в Dockerfile; скажем, это всегда порт 9191. Тогда в файле docker-compose.yml вы можете установить

slim-first:
  image: slim-image
  ports: ["9191:9191"]
slim-second:
  image: slim-image
  ports: ["9192:9191"]

и два контейнера будут доступны из разных портов хоста.

(EXPOSE в Dockerfile - это в основном документация; у него два редко встречающихся побочных эффекта. expose: в файле Docker Compose ничего для вас не делает вообще.)

...