我正在尝试使用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
所以这意味着它们在一个中间容器中运行。为什么这样,我该如何预防呢?
答案 0 :(得分:2)
TL; 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
)在前台运行:
$ 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为每个构建步骤创建它们。您在ENTRYPOINT
或CMD
中指定的命令在构建期间不会执行,它们只会被记录到最终图像中。