Python 即使使用分离标志,停靠的web服务也不会在后台运行

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-

我正在尝试使用和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-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"]