gpt4 book ai didi

scala - 如何在运行时为 docker 容器提供端口号?

转载 作者:行者123 更新时间:2023-12-02 18:44:27 25 4
gpt4 key购买 nike

我编写了一个基于 Scala 和 Akka HTTP 的 REST API,并创建了 Dockerfile 来为这个 API 创建 Docker 镜像。我的 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 主机上使用这个镜像运行两个容器。我已经修改了 REST API 主类,以便它将必须运行的端口号作为命令行参数。如果未提供命令行参数,则它将在 8080 端口上监听请求。

我想知道如何在启动容器时向我的 REST API 提供命令行参数?

例如:

  1. REST API 的第一个实例应该在端口 5555 上启动/运行,所以这个 5555 参数应该到达 REST API 的主类
  2. REST API 的第二个实例应该在端口 1111 上启动/运行,所以这个 5555 参数应该到达 REST API 的主类

我尝试为此使用 ENTRYPOINTCMD 但我的命令行参数根本没有到达主类并且 REST API 仅在 8080 端口上启动。

最佳答案

Docker PORT 映射就是您的答案。

Docker 化您的 API 恰恰相反,为您的 API 提供您希望每次运行它的端口。这正是您在采用 Docker 方式时不想做的事情。

您的 API 应该能够通过您决定在 docker 镜像上EXPOSE 的任何端口处理您的请求,然后,在运行时,您只需要映射您希望的任何端口托管到您的 API 的内部端口(在其容器内,将始终使用相同的“内部”端口。

那么..它看起来怎么样?

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

然后……

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

现在这两个实例都在您的主机上运行,​​您可以访问它们,每个都有不同的主机端口(即使在内部它们使用相同的端口号)

关于scala - 如何在运行时为 docker 容器提供端口号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56804995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com