我正在尝试将我的Django应用程序容器化,并且一切正常,除非我尝试从shell脚本运行容器。在这种情况下,Django服务器正在运行,但端口未在容器内打开。
这是我正在运行以启动容器的命令:
docker run -d -p 8000:8000 --net=mynet --name myapp -v $PWD:/myapp myimage ./ss
ss
是一个启动我的Django应用程序的shell脚本。它包含:
python3 manage.py runserver 0:8000
当我从命令行运行Docker RUN命令时,一切正常;端口映射正确,我可以从我的主机中的浏览器浏览到我的应用程序,并正确加载等等。
但是,如果我在shell脚本中复制上面的运行命令(例如start_container.sh),容器启动就好了,端口映射正确,但是当我尝试在浏览器中打开应用程序时,我得到了连接重置错误。
如果通过运行
打开容器的shelldocker exec -i -t myapp /bin/bash
我可以进入容器。我用ps -eaf
检查运行进程我确实看到运行我的Django应用程序的python进程。但是,如果我使用netstat -a
或netstat -l
检查容器内的开放端口,则端口8000 NOT 可用。
如果我然后停止容器,然后从命令行重新启动它,并检查容器,netstat -a
将显示端口8000可用,我可以从主机浏览器连接到我的应用程序。
我有点不知道如何解释如何从主机启动docker容器会对容器内部产生这种影响,而且我不确定我的下一个调试步骤应该是什么。
注意1:当在容器内部时,如果我运行启动脚本./ss
,则Django启动并且端口按预期打开。
注2:我也尝试在容器的Dockerfile中使用CMD [“ss”]指令,得到相同的结果;如果我从命令行启动容器,它工作正常。如果我从shell脚本启动它,容器内的端口就不会打开。