即使使用分离标志,Dockerized Web服务也不会在后台运行

时间:2018-04-29 02:00:23

标签: python docker

我正在尝试使用Tangelo和python来Docker化Web服务。

我的项目结构如下:

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告诉我,码头工人几乎一开始就停止了。我不知道问题是什么,因为我无法检查日志。

我已经尝试了很多东西,但我仍然无法弄明白这一点。

有什么想法吗?如果需要,我可以提供更多信息。

编辑:

当我建立时,第8步说

Step 8/8 : ENTRYPOINT tangelo --port 9220
 ---> Running in 8b54841853ab
Removing intermediate container 8b54841853ab

所以这意味着它们在一个中间容器中运行。为什么这样,我该如何预防呢?

1 个答案:

答案 0 :(得分:2)

TL; DR:使用:

CMD tangelo -np --port 9220

而不是:

CMD "tangelo --port 9220"

<强>解释

您有两种方法可以调试问题:

  1. 检查容器的日志:

    $ docker run -d test
    28684015e519c0c8d644fccf98240d1465acabab6d16c19fd59c5f465b7f18af
    $ sudo docker logs 28684015e519c
    /bin/sh: 1: tangelo --port 9220: not found
    
  2. 不是以分离模式运行,而是使用-i / --interactive(还可选-t / --tty)在前台运行:

    $ docker run -ti test
    /bin/sh: 1: tangelo --port 9220: not found
    
  3. 从上面可以看出,问题是tangelo --port 9220被解释为单个参数。通过删除引号将其拆分:

    CMD tangelo --port 9220  # this will use a shell
    

    或使用“exec”表单(首选,因为您不需要任何shell功能):

    CMD ["tangelo", "--port", "9220"]  # this will execute tangelo directly
    

    甚至更好地使用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为每个构建步骤创建它们。您在ENTRYPOINTCMD中指定的命令在构建期间不会执行,它们只会被记录到最终图像中。