Не запускается Docker контейнер

Рейтинг: 1Ответов: 1Опубликовано: 05.07.2023

Использую следующую команду для запуска контейнера docker run --name website -d -p 8000:5000 website:latest

(при параметре --rm контейнер и вовсе не создается)

Контейнер виден в приложении, но при попытке запустить его, процесс мгновенно прерывается

введите сюда описание изображения

следующим образом выглядит сам Dockerfile:

FROM python:stretch

RUN useradd website

WORKDIR /HealthPredict

COPY requirements.txt requirements.txt
RUN python -m venv HAWVenv
RUN HAWVenv/bin/pip install -r requirements.txt
RUN HAWVenv/bin/pip install gunicorn pymysql

COPY website/app website/app
COPY website/migrations website/migrations
COPY website/website.py website/config.py boot.sh ./
RUN chmod +x boot.sh

ENV FLASK_APP website/website.py

RUN chown -R website:website ./
USER website

EXPOSE 5000
ENTRYPOINT ["./boot.sh"]

При просмотре логов наблюдаю следующее:

./boot.sh: 2: ./boot.sh: source: not found
./boot.sh: 3: ./boot.sh: flask: not found
./boot.sh: 4: ./boot.sh: flask: not found
./boot.sh: 5: exec: gunicorn: not found

Сам файлик boot.sh выглядит следующим образом:

#!/bin/sh
source HAWVenv/bin/activate
flask db upgrade
flask translate compile
exec gunicorn -b :5000 --access-logfile - --error-logfile - website:app

При замене на #!/bin/bash в логах наблюдаю Error: No such command 'translate'., что относится к flask, хотя у flask определенно есть такой метод

Ответы

▲ 0

при параметре --rm контейнер и вовсе не создается

Контейнер создаётся, но вы не успеваете это заметить. При опции --rm докер создаёт временный контейнер. В этом контейнере докер запускает скрипт boot.sh. Когда скрипт завершается, докер удаляет временный контейнер.

Почему завершается boot.sh раньше, чем вы ожидали, написано в логах

./boot.sh: 2: ./boot.sh: source: not found

В шелле /bin/sh нет команды source, поэтому ваше виртуальное окружение не активируется, как следствие скрипт не находит ни flask, ни gunikorn, и завершается с ошибкой.

Вам следует либо поменять первую строку на #!/bin/bash, либо вместо source использовать .