Docker 如何从命令行指定要公开的端口和自定义参数

Docker 如何从命令行指定要公开的端口和自定义参数,docker,dockerfile,Docker,Dockerfile,我在SpringBoot中做了一个应用程序,我正在尝试用环境变量做一个Dockerfile,以指定要公开的端口以及命令行中的任何自定义参数 # defines a source container image to build upon FROM openjdk:8-jre-alpine # adding a volume to save the logs VOLUME /tmp # copy a local file into the container COPY build/libs/d

我在SpringBoot中做了一个应用程序,我正在尝试用环境变量做一个Dockerfile,以指定要公开的端口以及命令行中的任何自定义参数

# defines a source container image to build upon
FROM openjdk:8-jre-alpine

# adding a volume to save the logs
VOLUME /tmp

# copy a local file into the container
COPY build/libs/demo-0.0.1-SNAPSHOT.jar /app.jar

# environment variable
ENV SERVER_PORT 0
ENV JAVA_OPTS=""

# the app will listen on port ####
EXPOSE ${SERVER_PORT}

# tells Docker what it should execute when you run that container
ENTRYPOINT ["sh", "-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
当我跑步时:

docker run -d JAVA_OPTS=-Dserver.port=2020 SERVER_PORT=2020 -p 8080:2020 my-good-app
错误:

docker:引用格式无效:存储库名称必须为小写

我想从命令行执行此操作:

  • 指定容器要公开的端口
  • 指定应用程序运行时将使用的端口
  • 为了实现这一点,正如我上面的命令,我尝试了:

  • SERVER_PORT=2020(容器要公开的端口)
  • JAVA_OPTS=-Dserver.port=2020(我的应用程序运行时将使用的端口)

  • 我的目标是指定容器将从命令行公开的端口,我还想从命令行传递任何自定义参数/命令来编辑我的Spring Boot应用程序行为,在这种情况下,在它运行时更改它的端口以匹配容器公开的端口。

    无需自定义它。由于每个容器都在一个隔离的网络空间中运行,因此让多个容器在同一个端口上侦听并不成问题,只要在发布这些端口时使用不同的主机端口即可

    Spring Boot默认侦听端口8080,因此只需硬代码即可在Dockerfile中:

    来自openjdk:8-jre-alpine的
    
    复制build/libs/demo-0.0.1-SNAPSHOT.jar/app.jar
    #不需要在/tmp上有匿名卷
    #不需要自定义端口或提供空的默认变量
    #公开默认端口(主要用于文档)
    曝光8080
    #提供要运行的默认命令(Docker提供'sh-c`)
    CMD java$java_OPTS-Djava.security.egd=file:/dev//uradom-jar/app.jar
    
    当您运行它时,您可以指定任意主机端口,即使您运行了容器的多个副本。确保第二个
    -p
    端口号与容器实际侦听的端口号匹配

    docker run-d--名称app1-p8080:8080我的好应用
    docker run-d——名称app2-p8081:8080我的好应用
    
    在现代Docker上,“expose”作为一个动词几乎没有任何意义,让一个端口在没有监听的情况下暴露也没有什么害处。如果您确实需要一个不同的容器端端口,并且确实需要将其公开,原则上您仍然可以设置以下选项:

    docker run -d --name app3 \
      -e JAVA_OPTS=-Dserver.port=2020 \
      --expose 2020 \
      -p 8082:2020 \
      my-good-app
    

    在显示的
    docker run
    命令中,确保在设置的每个环境变量值之前指定
    -e
    选项(在
    服务器端口之前没有
    -e
    ,这会导致错误)。还请记住,在考虑
    docker run
    命令中的任何内容之前,Dockerfile的大部分内容都已完成处理;无论您在运行时设置了什么
    -e SERVER\u PORT=…
    ,映像始终具有
    EXPOSE 0
    。您可以在编译时指定它,但这样做没有多大价值。

    太棒了,谢谢您的解释和示例。我学到了很多。