Dockerized веб-сервис не работает в фоновом режиме даже при отключенном флаге - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь Dockerize веб-службы, используя Tangelo и Python.

Моя структура проекта выглядит следующим образом:

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 показывает мне, что докер останавливается почти сразу после его запуска. Я не знаю, в чем проблема, так как я не могу проверить журналы.

Я много чего пробовал, но до сих пор не могу разобраться.

Есть идеи? При необходимости могу предоставить больше информации.

EDIT:

Когда я строю, шаг 8 говорит

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

Так что это означает, что они запускаются в промежуточном контейнере. Почему это так и как я могу предотвратить это?

1 Ответ

0 голосов
/ 29 апреля 2018

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» (предпочтительно, если вам не нужны какие-либо функции оболочки):

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

Танжело жалуется на то, что внутри контейнера нет пользователя и группы с именем nobody. Опять же, есть две вещи, которые вы можете сделать: добавить RUN, чтобы создать пользователя и группу nobody, или запустить Tangelo с параметром -np / --no-drop-privileges:

ENTRYPOINT ["tangelo"]
CMD ["--no-drop-privileges", "--port", "9220"]

Хорошо, если во время сборки вы видите промежуточные контейнеры: Docker создает их для каждого шага сборки. Команды, которые вы указываете в ENTRYPOINT или CMD, не выполняются во время сборки, они просто записываются в окончательный образ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...