Команда из compose не выполняется в файле entrypoint.sh

У меня есть Dockerfile для моего проекта python django, а затем у меня есть docker-compose, который я использую для сборки и развертывания моего приложения. В настоящее время в файле compose есть только приложение django, nginx и db-сервер.

Аргумент ENTRYPOINT в Dockerfile моего приложения - это скрипт entrypoint.sh, который запускает некоторые миграции, и в конце у меня есть строка exec "$@", которая должна выполнять Command, переданную через docker-compose.

Но похоже, что команда из Dockerfile не выполняется или аварийно завершается. Я вижу из вывода docker ps -a --no-trunc, что команда действительно передается в качестве аргумента в ENTRYPOINT.

Я попробовал перенести команду из файла compose в entrypoint.sh, и приложение запускается просто отлично. Но когда команда передается из файла compose, ничего не происходит.

Я также попытался echo "$@", чтобы проверить, что было получено, но там тоже пусто.

Вот сервис моего приложения в compose:

version: '3'
services:

  django_app:
    container_name: django_app
    build:
      context: .
      dockerfile: Dockerfile
    image: django_app:latest
    command: gunicorn app.wsgi:application --preload --bind 0.0.0.0:8000 --workers=4 -t 300
    expose:
      - 8000
    depends_on:
      - db
    env_file:
      - ./.env

Это точка входа.sh:

#!/bin/sh
set -e

python3 manage.py migrate
python3 manage.py groups
python3 manage.py superuser_fromenv
python3 manage.py create_custom_permissions
echo "done"
echo "$@"
exec "$@"

От разочарования я попробовал exec $@, но не помогло.

<
FROM python:3.8-slim-buster as BASE
FROM BASE as package

ENV PATH="/opt/venv/bin:$PATH"
ENV PYTHONPATH="/opt/venv:$PYTHONPATH"
ENV APP_HOME="/home/app"
WORKDIR $APP_HOME

COPY --from=build /opt/venv /opt/venv
COPY . $APP_HOME

RUN chmod +x  $APP_HOME/entrypoint.sh
ENTRYPOINT ["sh", "-c", "./entrypoint.sh"]
И, наконец, последнее, но не менее важное: вот Dockerfile:

Если вы оборачиваете команду в sh -c, то оболочка потребляет все дополнительные аргументы, которые даются (включая CMD), и не передает их внутренней команде. Если вы используете шаблон entrypoint-wrapper (что я часто рекомендую), то у вас не должно быть обертки sh -c ни вручную, ни с помощью формы оболочки ENTRYPOINT.

# ENTRYPOINT must be JSON-array format and must not have `sh -c`
ENTRYPOINT ["./entrypoint.sh"]

# CMD can be any valid Dockerfile command
CMD gunicorn app.wsgi:application --preload --bind 0.0.0.0:8000 --workers=4 -t 300
Вернуться на верх