Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker:在运行时将自定义端口设置为环境变量,而不是在生成时_Docker - Fatal编程技术网

Docker:在运行时将自定义端口设置为环境变量,而不是在生成时

Docker:在运行时将自定义端口设置为环境变量,而不是在生成时,docker,Docker,docker文件 FROM flask:1.0 COPY ./ /app WORKDIR /app # install commands RUN DEBIAN_FRONTEND=noninteractive apt-get update RUN DEBIAN_FRONTEND=noninteractive apt-get install -y sudo #RUN DEBIAN_FRONTEND=noninteractive apt-get update RUN DEBIAN_FRONTEND

docker文件

FROM flask:1.0

COPY ./ /app
WORKDIR /app

# install commands
RUN DEBIAN_FRONTEND=noninteractive apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y sudo
#RUN DEBIAN_FRONTEND=noninteractive apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y curl

#installing sql server odbc
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y apt-utils



#install python stuff
RUN pip3 install -r requirements.txt
ENTRYPOINT [ "python3" ]

#start server

ARG PORT=8004
ENV PORT=$PORT
#start server
EXPOSE ${PORT}

# RUN chmod +x src/entrypoint.sh 
RUN chmod +x entrypoint.sh
# ENTRYPOINT [ "gunicorn", "-w", "4", "-b", "0.0.0.0:8004", "--chdir", "src", "wsgi:app" ]
ENTRYPOINT ["./entrypoint.sh"]
入口点文件

#!/bin/sh
gunicorn -w 4 -b 0.0.0.0:$PORT --chdir src wsgi:app
因此,当前,当我构建docker映像时,我在构建期间传递端口值8005,然后使用8005运行它,容器将使用端口8005运行

Create docker image:
 docker build -t test:1.0 . --build-arg PORT=8005 
Run docker container: docker run -p 8005:8005 -d test:1.0
但我需要在运行期间而不是在构建期间传递端口(这不起作用,需要8004)


问题是您没有将
-e port
赋予
docker run
命令,而是赋予容器中运行的任何对象

以下内容应该有效

docker run -p 8005:8005 -d -e PORT=8005 test:1.0 
例如,如果您运行:

docker run -p 8005:8005 -d -e PORT=8005 test:1.0 ls

它将在容器内输出workdir的内容。

何必麻烦呢?您可以选择您选择的主机端口(
-p
参数的左侧),以显示容器中的服务正在侦听的端口。因此,您可以执行
-p 8004:8005
以在主机上的端口8004上公开服务,或者执行
-p 1234:8005
以在主机上的端口1234上公开服务,等等。只需将容器配置本身保持静态。我必须更改docker文件中的任何内容吗@larsks你是说下面的工作?docker run-p 8004:8005-d test:1.0我的意思是,为了在您选择的主机端口上公开服务,您不需要更改容器配置。假设您的服务正在侦听容器中的端口8005,那么您在评论中发布的内容应该可以正常工作。
docker run -p 8005:8005 -d -e PORT=8005 test:1.0 ls