Как дать номер порта для Docker-контейнера во время выполнения? - PullRequest
1 голос
/ 28 июня 2019

Я написал один REST API для Scala и Akka HTTP и создал Dockerfile для создания образа Docker для этого API. Мой Dockerfile выглядит следующим образом:

FROM maven:3.6.0-jdk-8-alpine AS MAVEN_TOOL_CHAIN
COPY pom.xml /tmp/parent/
COPY data-catalogue/pom.xml /tmp/parent/data-catalogue/
COPY data-catalogue/src /tmp/parent/data-catalogue/src/
WORKDIR /tmp/parent/data-catalogue/
RUN mvn package

FROM java:openjdk-8
COPY --from=MAVEN_TOOL_CHAIN /tmp/parent/data-catalogue/target/data-catalogue-1.0-SNAPSHOT.jar /opt/data-catalogue.jar

COPY data-catalogue/src/main/resources/logback.xml /opt/logback.xml

ENTRYPOINT ["java", "-Dlogging.config=/opt/logback.xml", "-jar", "/opt/data-catalogue.jar", "prod"]
CMD ["8080"]

Пока все хорошо. Я могу запустить один контейнер, используя это изображение.

Теперь необходимо запустить два контейнера с этим образом на одном хосте Docker. Я изменил основной класс API REST таким образом, чтобы он принимал номер порта, на котором он должен работать, в качестве аргумента командной строки. Если аргумент командной строки не указан, он будет прослушивать запросы на порт 8080.

Я хотел бы знать, как предоставить параметр командной строки для моего REST API при запуске контейнера?

Например:

  1. Первый экземпляр REST API должен запускаться / запускаться на порту 5555, поэтому этот аргумент 5555 должен достигать основного класса REST API
  2. Второй экземпляр REST API должен запускаться / запускаться на порту 1111, поэтому этот аргумент 5555 должен достигать основного класса REST API

Я пытался использовать ENTRYPOINT и CMD для этого, но мой аргумент командной строки просто не достигает основного класса, и REST API запускается только на порту 8080.

Ответы [ 3 ]

3 голосов
/ 28 июня 2019

Отображение Docker PORT - ваш ответ.

Докеризация вашего API - это полная противоположность предоставлению вашему API порта, на котором вы хотите запускать его каждый раз. Это именно то, что вы не хотите делать, когда идете по пути Docker.

Ваш API должен иметь возможность обслуживать ваши запросы через любой порт, который вы решите EXPOSE на своем образе докера, а затем, во время выполнения, вам просто нужно отобразить любой порт, который вы хотите, от вашего хоста до внутреннего порта. вашего API (который внутри своего контейнера всегда будет обслуживать один и тот же «внутренний» порт.

Так .. как это выглядит?

docker run -d --name api-1 -p 5555:8080 my/api

, а затем ...

docker run -d --name api-2 -p 1111:8080 my/api

Теперь оба экземпляра работают на вашем хосте, и вы можете поразить их обоих, каждый из которых имеет свой порт хоста (даже если внутри они используют один и тот же номер порта)

2 голосов
/ 28 июня 2019

через переменные среды

В Dockerfile:

ENV PORT 8080 

Вы можете переопределить выше env в cmd, передав -e, например,

docker run -d my_image -e "PORT=5555"

Использовать env в вашем коде приложения

Так, например, если вы не предоставите env для cmd, код вашего приложения получит 8080 в качестве значения PORT. Если вы переопределите env для cmd, код вашего приложения получит 5555 в качестве значения PORT

2 голосов
/ 28 июня 2019

вы можете установить ARG для вашего контейнера:

ARG MYPORT

, затем экспортировать его как:

CMD [ $MYPORT ]

, затем запустить докер следующим образом:

export MYPORT=5000 ; docker run ....
...