来自 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
我的 python django 项目有一个 Dockerfile,然后我有一个 docker-compose 用于构建和部署我的应用程序。目前,compose文件只有django app、nginx和db server。
我应用程序的 Dockerfile 中的 ENTRYPOINT arg 是运行一些迁移的 entrypoint.sh 脚本,最后我有 exec "$@"
行应该是执行通过 docker-compose.
但是似乎来自 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