Python 即使使用分离标志,停靠的web服务也不会在后台运行
我正在尝试使用和python对web服务进行Dockerize 我的项目结构如下:Python 即使使用分离标志,停靠的web服务也不会在后台运行,python,docker,Python,Docker,我正在尝试使用和python对web服务进行Dockerize 我的项目结构如下: test.py requirements.txt Dockerfile test.py import ... def run(query): ... return response requirements.txt ... # other packages, numpy, open-cv, etc tangelo Dockerfile FROM ubuntu:latest RUN apt-
test.py
requirements.txt
Dockerfile
test.py
import ...
def run(query):
...
return response
requirements.txt
... # other packages, numpy, open-cv, etc
tangelo
Dockerfile
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y python python-pip git
EXPOSE 9220
ADD . /test
WORKDIR /test
RUN pip install -r requirements.txt
CMD "tangelo --port 9220"
我使用
docker build -t "test" .
并在分离模式下使用
docker run -p 9220:9220 -d "test"
但是docker ps
告诉我docker几乎一启动就停止了。我不知道是什么问题,因为我无法检查日志
我试过很多东西,但我还是搞不懂这件事
有什么想法吗?如果需要,我可以提供更多信息
编辑:
当我构建时,第8步说
Step 8/8 : ENTRYPOINT tangelo --port 9220
---> Running in 8b54841853ab
Removing intermediate container 8b54841853ab
这意味着它们是在一个中间容器中运行的。这是为什么?我该如何预防;DR:使用:
CMD tangelo -np --port 9220
而不是:
CMD "tangelo --port 9220"
说明: 有两种方法可以调试该问题:
$ docker run -d test
28684015e519c0c8d644fccf98240d1465acabab6d16c19fd59c5f465b7f18af
$ sudo docker logs 28684015e519c
/bin/sh: 1: tangelo --port 9220: not found
-i
/--interactive
(也可以选择-t
/--tty
):
tangelo--port 9220
被解释为单个参数。通过删除引号将其拆分:
CMD tangelo --port 9220 # this will use a shell
或者使用“exec”表单(如果您不需要任何shell功能,则首选):
或者更好地使用ENTRYPOINT
+CMD
:
ENTRYPOINT ["tangelo"]
CMD ["--port", "9220"] # this will execute tangelo directly
进行此更改后,您仍然会遇到以下问题:
$ sudo docker run -ti test
...
[29/Apr/2018:02:43:39] TANGELO no such group 'nobody' to drop privileges to
Tangelo抱怨容器中没有名为nobody
的用户和组。同样,您可以做两件事:添加RUN
以创建nobody
用户和组,或者使用-np
/--no-drop-privileges
选项运行Tangelo:
ENTRYPOINT ["tangelo"]
CMD ["--no-drop-privileges", "--port", "9220"]
在构建过程中,如果您看到中间容器,这没关系:Docker为每个构建步骤创建它们。您在
ENTRYPOINT
或CMD
中指定的命令在构建期间不会执行,它们只是记录到最终图像中。好的,谢谢。然而,这并没有让事情运转起来。让它在前台运行会显示Tangelo的调试日志,以及一行隐晦的Tangelo没有这样的组“nobody”可以放弃特权。不确定这是否会导致东西关闭。如果我在禁用缓存的情况下重新构建,会不会有影响?最后,我不确定是否会有影响,但ENTRYPOINT和CMD命令在构建期间在中间容器中运行,并在构建后不久被丢弃。@cᴏʟᴅsᴘᴇᴇᴅ: 您可以使用-np
:CMD[“tangelo”、“-np”、“--port”、“9220”],告诉tangelo不要将用户更改为nobody
,这似乎对我没有任何帮助。它对你有用吗?ENTRYPOINT和COMMAND实际上并没有运行任何东西。它们只是将元数据添加到生成的图像中,以便docker知道在容器开始时运行什么。这会通过生成过程中生成的任何中间容器向下传播。@avigil有趣!第一次在此使用docker;-)
$ sudo docker run -ti test
...
[29/Apr/2018:02:43:39] TANGELO no such group 'nobody' to drop privileges to
ENTRYPOINT ["tangelo"]
CMD ["--no-drop-privileges", "--port", "9220"]