我正在尝试在Docker Compose中启动一个简单的Django应用服务器,并与Postgres容器配对。它按预期运行,启动了入口点脚本,但似乎从未真正运行Django应用服务器(这应该是最后一步,并保持运行状态)。
我知道它运行入口点脚本,因为运行了迁移步骤。应用程序服务器从不输出任何预期的输出,并且端口8000从不响应。
如果有问题,我正在使用Mac的Docker(稳定)。
我的Django应用容器的Dockerfile:
FROM ubuntu:16.04
COPY my_app /my_app
RUN apt-get update \
&& apt-get install -y python3 python3-psycopg2 python3-pip
RUN apt-get install -y nodejs npm
WORKDIR /my_app
RUN pip3 install -r requirements.txt
RUN npm install bower
RUN python3 manage.py bower install
RUN python3 manage.py collectstatic --no-input
EXPOSE 8000
COPY entrypoint.sh /
RUN chmod 755 /entrypoint.sh
CMD python3 manage.py runserver 0.0.0.0:8000
ENTRYPOINT ["/entrypoint.sh"]
Django入口点脚本:
#!/bin/sh
# Allow database container to start up or recover from a crash
sleep 10
cd /my_app
# Run any pending migrations
python3 manage.py migrate
exec $@
docker-compose.yml:
version: '2'
services:
db:
image: postgres:9.6
volumes:
- ./db/pgdata:/pgdata
environment:
- POSTGRES_USER=my_user
- POSTGRES_PASSWORD=my_password
- PGDATA=/pgdata
- POSTGRES_DB=my_database
appserver:
image: my-image
command: python3 manage.py runserver 0.0.0.0:8000
ports:
- '8000:8000'
environment:
- POSTGRES_USER=my_user
- POSTGRES_PASSWORD=my_password
- POSTGRES_DB=my_database
links:
- db
depends_on:
- db
最佳答案
在Dockerfile中为CMD
使用exec表单
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
entrypoint.sh
脚本exec
当前正在尝试运行:/bin/sh -c python3 manage.py runserver 0.0.0.0:8000
这似乎不起作用,我认为它只是运行
python3
。您应该使用quote the positional parameters variable,以便 shell 程序保留每个参数,即使有空格也是如此。
exec "$@"
但是最好不要在docker和您的应用之间插入
sh
,因此请始终将exec形式用于CMD
。
关于python - Django应用程序服务器挂起/无法在Docker Compose中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38800238/