Docker-контейнер, существующий после запуска без ошибок в журнале

У меня есть приложение на Python, состоящее из моделей анализа изображений и 2 файлов сценариев. В Main.py у меня есть сервер XMLRPC, чтобы работать вечно, слушая клиентов.

if __name__ == "__main__":
    server = SimpleXMLRPCServer(("0.0.0.0", 8888))
    print("Listening on port 8888...")
    server.register_function(result, "result")
    server.serve_forever()

Мой Dcokerfile это:

# Start with NVIDIA's CUDA and cuDNN base image.
FROM nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04

# Argument: the username & password.
ARG username
ARG user_password

# Update the system.
RUN echo "debconf debconf/frontend select Noninteractive" | debconf-set-selections
RUN apt-get update
RUN apt-get upgrade --assume-yes

...... bla bla bla

WORKDIR /home/${username}

# Copy the current directory contents into the container at /home/${username}
ADD . /home/${username}

...... bla bla bla

# Expose the ports and start the ssh daemon as entry point.
USER root
EXPOSE 22 6006 8888
ENTRYPOINT ["/usr/sbin/sshd", "-D"]

Когда я добавляю CMD для запуска моего Main.py Контейнер не работает, он немедленно выходит. Какова лучшая практика, с которой я смогу запустить этот контейнер? Я использую виртуальную машину Azure Data Science для Linux Ubuntu.

Я построил свой Dockerfile с:

 docker build . --tag img_processing:V1 --build-arg "username=blabla" --build-arg "user_password=blabla"

И я запускаю свой контейнер с:

docker run -d -p 4000:8888 img_processing

В настоящее время я использую docker exec -it my-app-container bash и внутри моего контейнера я управляю вещами и запускаю python Main.py & запускать сценарий в фоновом режиме, который я не считаю хорошим способом. особенно я должен найти способ увеличить и обработать 3000 изображений одновременно. Таким образом, каждый контейнер должен иметь одинаковую настройку.

Любая идея?

2 ответа

Решение

Прежде всего, никогда не подвергайте PORT 22 и не запускайте SSH внутри контейнеров. Это не рекомендуется делать

Далее вы можете указать либо ENTRYPOINT, либо CMD как

CMD ["python", "Main.py"]

Для этого вам нужно убедиться, что Main.py находится в текущем каталоге WORKDIR что вы указали

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

Когда ваш контент сразу выходит, вы должны удалить -d пометить и использовать -it флаг для устранения проблемы

docker run -it -p 4000:8888 img_processing

Ты можешь сделать ENTRYPOINT ["python", "Main.py"], Это установит python Main.py быть командой по умолчанию для контейнера. Вы можете прочитать больше о ENTRYPOINT в документации по Dockerfile.

Другие вопросы по тегам