Не удалось запустить http.сервер Python3 в контейнере Docker

#python #docker

Вопрос:

Я пытаюсь создать контейнер Docker, который запускает http.сервер Python, прослушивающий порт 8000. Это мой док-файл:

 FROM ubuntu:20.04 AS focal

WORKDIR /usr/src/server
COPY . .

RUN apt update amp;amp; apt-get install -y build-essential python python3 zip net-tools iptables sudo curl

CMD ["python3", "-m http.server", "8000"]
 

Во-первых, я успешно построил образ: docker build -t py_server .

Затем я попытался запустить изображение в качестве контейнера: docker run --rm -p 8000:8000 py_server

Но была выдана следующая ошибка:

 /usr/bin/python3: Error while finding module specification for ' http.server' (ModuleNotFoundError: No module named ' http')
 

Не уверен, почему python3 не смог найти http модуль, указанный с помощью CMD в файле Dockerfile. Я проверил, есть ли python3 в контейнере http.server , непосредственно выполнив команду с помощью bash на изображении py_server, и это сработало:

 $ docker run -it --rm -p 8000:8000 py_server bash
root@d3426b37cf2e:/usr/src/cs435_mp1_server# python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
 

Я очень смущен этим.

Ответ №1:

Я просто заметил, что перед «http.server» было пространство, из-за которого python3 не смог найти модуль.

Я отредактировал строку CMD в своем файле настройки, и теперь она работает:

 CMD ["python3", "-m", "http.server", "8000"]
 

Все еще не совсем понимаю, почему ранее было добавлено пространство перед «http.server», хотя.

Комментарии:

1. Потому что вы включили это в одно слово оболочки. Вы получили бы тот же эффект, если бы работали "python" "-m http.server" "8000" в настройках Python, отличных от докера.