В Docker-образе Python не видится установленная библиотека

У меня есть Dockerfile, из которого я создаю образ:

FROM python:3.8

WORKDIR /root/scripts

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

А это requirements.txt:

schedule==1.2.0

Сборка:

docker build . -t my-python

Образ устанавливается без ошибок, если ввести docker images, то образ показывается в списке

Далее у меня есть файл docker-compose.yaml:

version: '3'
services:
  amoRU:
    image: my-python
    command: /usr/bin/python3 /dist/amoRU.py
    restart: always
    volumes:
      - "./amoCRM/amoRU/:/dist"

Запускаю его командой:

docker compose up

И получаю ошибку об отсутствии модуля schedule, который импортируется в начале файла amoRU.py. Сам файл он видит, проблема именно в образе

Как мне проверить вообще установился ли он в образ изначально: когда происходит build, не успеваю заметить, все очень быстро происходит? Может быть, я как-то не так указываю requirements.txt?


Ответы (1 шт):

Автор решения: andreymal

Прикол в том, что в образе python:3.8 два разных питона:

In the non-slim variants there will be an additional (distro-provided) python executable at /usr/bin/python (and/or /usr/bin/python3) while the desired image-provided /usr/local/bin/python is the default choice in the $PATH.

Заходим в шелл вашего образа и смотрим:

$ docker run -it my-python /bin/sh
# /usr/local/bin/python3 --version
Python 3.8.18
# /usr/bin/python3 --version
Python 3.11.2

Вы установили все библиотеки для питона 3.8 (команда pip соответствует /usr/local/bin/pip), а запускать скрипт пытаетесь через /usr/bin/python3, который запускает дебиановый питон 3.11.

Что можно предпринять для решения:

  1. Запускать правильный питон — уберите полный путь вообще, чтобы нашёлся правильный питон из $PATH: command: python3 /dist/amoRU.py

  2. Заменить базовый образ на другой, в котором будет только один питон: FROM python:3.8-slim — имейте в виду, что в нём /usr/bin/python3 не существует и есть только /usr/local/bin/python3 (но, как я упомянул выше, лучше написать просто python3 без полного пути)

→ Ссылка