即使使用分离标志,Docked webservice也不会在后台运行

2024-04-20 03:41:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这意味着它们是在中间容器中运行的。为什么会这样?我怎样才能防止呢?你知道吗


Tags: installpipdockerrunpytestdockerfiletxt
1条回答
网友
1楼 · 发布于 2024-04-20 03:41:31

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
    

从上面可以看出,问题是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中指定的命令在构建期间不会执行,它们只是记录到最终映像中。你知道吗

相关问题 更多 >