Docker环境下FastAPI+Gunicorn服务如何覆盖Dockerfile设定的端口?
问题原因
你当前的-p 7000:7000参数仅配置了宿主机到容器的端口映射规则,没有修改容器内部gunicorn服务的监听端口,所以服务默认还是启动在8000端口,此时容器的7000端口没有任何进程监听,自然无法转发流量。
可用解决方案
方案1:仅修改端口映射(不需要改Dockerfile/启动命令)
如果你不需要修改容器内部的服务监听端口,只想通过宿主机的7000端口访问服务,直接调整端口映射规则即可:
subprocess.call(f"docker run -it -p 7000:8000 test", shell=True)
该配置会将宿主机7000端口的流量转发到容器内的8000端口,可直接正常访问。
方案2:动态覆盖容器启动命令(不需要改Dockerfile)
如果需要容器内的gunicorn也监听指定端口,可以在docker run时直接传入自定义启动命令,覆盖Dockerfile中写死的CMD:
@ runtime.command() def run(branch: Optional[str] = "master", port: Optional[int] = 8000): # 动态拼接端口到启动命令中 subprocess.call(f'docker run -it -p {port}:{port} test gunicorn --bind 0.0.0.0:{port} --reload -k uvicorn.workers.UvicornWorker app.main:app', shell=True)
方案3:Dockerfile配置环境变量支持动态端口(长期使用推荐)
先修改Dockerfile,将端口参数改成环境变量注入的形式:
# 定义默认端口环境变量 ENV SERVER_PORT=8000 # 修改CMD为支持变量解析的形式 CMD ["sh", "-c", "gunicorn --bind 0.0.0.0:$SERVER_PORT --reload -k uvicorn.workers.UvicornWorker app.main:app"]
之后CLI中启动容器时传入对应的环境变量即可:
@ runtime.command() def run(branch: Optional[str] = "master", port: Optional[int] = 8000): subprocess.call(f"docker run -it -e SERVER_PORT={port} -p {port}:{port} test", shell=True)
内容的提问来源于stack exchange,提问作者DSGym
相关产品推荐
相关产品推荐

