Команда из 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