【Docker】Примечания по отладке Docker

Заметки об отладке Docker

./Dockerfile

FROM python:3.10
WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY src/* /app/


CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]
docker build -t 'noticedemo' .

Нет проблем, образ был успешно построен, но при запуске возникла проблема

docker run -d -p 3000:3000 noticedemo
docker ps  # 发现容器并不在运行列表
docker ps -a # 容器在列表,并未运行

В этот момент при запуске должна возникнуть проблема. Давайте проверим журнал работы контейнера.

docker logs [CONTAINER ID]

Очень странно обнаружить сообщение об ошибке ModuleNotFoundError: No module named 'utils'
вставьте сюда описание изображения
, потому что оно может нормально работать с Gunicorn напрямую, без использования Docker.
После долгой отладки я наконец с помощью наставника нашел точку этой огромной ямы.

После процесса отладки

Мы хотим войти в докер-контейнер, чтобы просмотреть соответствующую информацию, но нам нужно, чтобы сначала запустился контейнер, а теперь контейнер вообще не может запуститься.
Причина анализа в том, что при выполнении контейнером команды CMD возникает ошибка и операция завершается неудачей. Измените команду CMD на команду, не связанную со структурой кода, чтобы контейнер мог успешно работать и было удобно. чтобы мы могли отладить. Здесь мы используем python -m http.server для реализации этой идеи.
Измененный файл Dockerfile.

FROM python:3.10
WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY src/* /app/


# CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]
CMD ["python", "-m", "http.server"]

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

docker exec -it [CONTAINER ID] /bin/bash

После успешного ввода проверьте структуру кода:
вставьте сюда описание изображения
Посмотрите на нашу исходную структуру кода:
вставьте сюда описание изображения
согласно этой инструкции в Dockerfile, мы ожидаем скопировать все структуры из папки src локального каталога в рабочий каталог/приложение Docker.

COPY src/* /app/

Однако было обнаружено, что ожидаемой структуры подпапок не было, а все файлы в подпапке были скопированы непосредственно в /app, поэтому ссылочная структура в исходном коде также сообщала об ошибке при запуске в контейнере
from utils.lark import *.

Метод модификации

Просто измените Dockerfile

FROM python:3.10
WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY src /app # COPY src/* /app/


CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

Пересоберите, запустите, запустите успешно, войдите в контейнер, чтобы просмотреть структуру,
вставьте сюда описание изображения
соответствующую нашей ожидаемой структуре, и проблема решена.
PS: Выходим из контейнера командой:exit

рекомендация

отblog.csdn.net/MarsherS/article/details/125648956
рекомендация