来自 compose 的命令未在 entrypoint.sh 中执行

command from compose not executed in entrypoint.sh

我的 python django 项目有一个 Dockerfile,然后我有一个 docker-compose 用于构建和部署我的应用程序。目前,compose文件只有django app、nginx和db server。

我应用程序的 Dockerfile 中的 ENTRYPOINT arg 是运行一些迁移的 entrypoint.sh 脚本,最后我有 exec "$@" 行应该是执行通过 docker-compose.

传递的 Command

但是似乎来自 Dockerfile 的命令没有执行或崩溃。 我可以从 docker ps -a --no-trunc 的输出中看到该命令确实作为 arg 传递给了 ENTRYPOINT。

我确实尝试将命令从撰写文件移动到 entrypoint.sh,应用程序启动得很好。但是当它从撰写文件传递时,没有任何反应。

我也尝试 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

这是entrypoint.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 $@,但没有帮助。

最后但并非最不重要的是,这里是 Dockerfile:

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"]

如果你在 sh -c 中包装一个命令,那 shell 会消耗所有给定的额外参数(包括 CMD)并且不会将它们传递给内心的命令。如果您正在使用入口点包装器模式(我经常推荐),那么您不能手动使用 sh -c 包装器或使用 ENTRYPOINT.[=15 的 shell 形式=]

# 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