Docker 如何从命令行指定要公开的端口和自定义参数
我在SpringBoot中做了一个应用程序,我正在尝试用环境变量做一个Dockerfile,以指定要公开的端口以及命令行中的任何自定义参数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
# 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:引用格式无效:存储库名称必须为小写
我想从命令行执行此操作:
我的目标是指定容器将从命令行公开的端口,我还想从命令行传递任何自定义参数/命令来编辑我的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
。您可以在编译时指定它,但这样做没有多大价值。太棒了,谢谢您的解释和示例。我学到了很多。