Вводная для понимания вопроса: телеграм - бот, присылающий действия в git-репозитории.
В качестве сервера webhook выбран django, в этом же проекте лежит скрипт самого бота.
Все это дело упаковано в docker-compose.
Привожу текст файлов.
docker-compose.yml:
version: '2'
services:
web:
build:
context: ../
dockerfile: Dockerfile
command: bash -c "python manage.py runserver 0.0.0.0:8000"
ports:
- '8000:8000'
container_name: bss-monitoring
volumes:
- ../:/app/
bot:
build:
context: ../
container_name: monitoring_bot
restart: always
command: python bot.py
Dockerfile:
# указание базового образа onbuild
FROM python:3.7
# выбор рабочей директории
WORKDIR /app/
# копирование нужного файла из текущей (где лежат все нужные файлы) в рабочую директорию
COPY . /app
# обновить pip
RUN pip install --upgrade pip
# добавить пользователя, от которого будут выполняться команды
# иначе будет ошибка: WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager.
#It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
RUN adduser myuser
USER myuser
# поменять пользователя, от которого будут выполняться команды
COPY --chown=myuser:myuser requirements.txt requirements.txt
# запуск от пользователя USER
RUN pip install --user -r requirements.txt
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Вопрос такой: в проекте есть код, в котором расписывается порядок обработки приходящего json-сообщения (назовем его handler.py) и в последующем передающегося боту (bot.py).
Внесла некоторые изменения в код handler.py и они сразу же отразились в работе. Вручную не пришлось пересобирать образ и перезапускать контейнеры. При этом самостоятельно перезапустился контейнер с ботом (bot), выкинув ошибку, что уже есть запущенный экземпляр бота в телеге(по логам). При этом работа продолжилась в штатном режиме.
telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 409. Description: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
Подскажите, пожалуйста, почему так происходит?
Это мой первый такой "проект" и может показаться странным и чрезмерным использовать docker-compose и в целом усложненный подход, но я это делаю для того, чтоб разобраться, как работает система.