Notas de depuração do 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' .
Não tem problema, a imagem foi construída com sucesso e houve um problema ao executar
docker run -d -p 3000:3000 noticedemo
docker ps # 发现容器并不在运行列表
docker ps -a # 容器在列表,并未运行
Neste momento, deve haver um problema durante a execução, vamos verificar o log de execução do contêiner.
docker logs [CONTAINER ID]
É muito estranho descobrir que o erro é relatado ModuleNotFoundError: No module named 'utils'
, pois ele pode rodar normalmente com o gunicorn diretamente, sem usar o docker.
Depois de muito tempo de depuração, finalmente encontrei o ponto desse enorme buraco com a ajuda do mentor.
Após o processo de depuração
Queremos entrar no contêiner docker para visualizar informações relevantes, mas precisamos que o contêiner seja executado primeiro, mas agora o contêiner não pode ser executado.
O motivo da análise é que quando o contêiner executa o comando CMD, ele relata um erro e falha na execução. Modifique o comando CMD para um comando que não esteja relacionado à estrutura do código, para que o contêiner possa ser executado com sucesso e seja conveniente para depurarmos. Aqui usamos python -m http.server para realizar esta ideia
Dockerfile modificado
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"]
Após a modificação, re-docker build e docker run, e o contêiner será executado com sucesso neste momento.
Entramos no contêiner para verificar:
docker exec -it [CONTAINER ID] /bin/bash
Inserido com sucesso, verifique a estrutura do código:
Veja nossa estrutura de código original:
De acordo com esta instrução no Dockerfile, o que esperamos é copiar todas as estruturas na pasta src do diretório local para o diretório de trabalho/app do docker
COPY src/* /app/
No entanto, descobriu-se que não havia estrutura de subpasta esperada, mas todos os arquivos na subpasta foram copiados diretamente para /app, portanto, a estrutura de referência no código-fonte também relatou um erro quando estava sendo executada no contêiner
from utils.lark import *
.
Método de modificação
Basta modificar o 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"]
Reconstrua, execute, execute com sucesso, entre no contêiner para ver se a estrutura
é consistente com nossa estrutura esperada e o problema está resolvido.
PS: Saia do comando do contêiner:exit