Заметки об отладке 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