В 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 шт):
Прикол в том, что в образе python:3.8 два разных питона:
In the non-slim variants there will be an additional (distro-provided)
pythonexecutable at/usr/bin/python(and/or/usr/bin/python3) while the desired image-provided/usr/local/bin/pythonis 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.
Что можно предпринять для решения:
Запускать правильный питон — уберите полный путь вообще, чтобы нашёлся правильный питон из
$PATH:command: python3 /dist/amoRU.pyЗаменить базовый образ на другой, в котором будет только один питон:
FROM python:3.8-slim— имейте в виду, что в нём/usr/bin/python3не существует и есть только/usr/local/bin/python3(но, как я упомянул выше, лучше написать простоpython3без полного пути)