Docker-compose 服务已退出,代码为 0
Docker-compose service exited with code 0
我对 Docker 很陌生。我正在尝试 运行 Django on Docker。以下是我的 docker-compose 文件。
version: '2'
services:
django:
build:
context: .
dockerfile: ./deploy/dev/Dockerfile
tty: true
command: python manage.py runserver 0.0.0.0:8000
ports:
- "8000:8000"
volumes:
- ./app:/src/app
depends_on:
- "workflow_db"
- "rabbitmq"
env_file:
- ./deploy/dev/envvar.env
workflow_db:
image: postgres:9.6
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=hello_django
- POSTGRES_PASSWORD=hello_django
- POSTGRES_DB=hello_django
rabbitmq:
image: "rabbitmq:3-management"
hostname: "rabbitmq"
environment:
RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
RABBITMQ_DEFAULT_USER: "rabbitmq"
RABBITMQ_DEFAULT_PASS: "rabbitmq"
RABBITMQ_DEFAULT_VHOST: "/"
ports:
- "15672:15672"
- "5672:5672"
volumes:
postgres_data:
Docker文件
FROM python:3.7-alpine
RUN apk update && apk add --no-cache gcc libffi-dev g++ python-dev build-base linux-headers postgresql-dev postgresql postgresql-contrib pcre-dev bash alpine-sdk \
&& pip install wheel
#Copy over application files
COPY ./app /src/app
#Copy over, and grant executable permission to the startup script
COPY ./deploy/dev/entrypoint.sh /
RUN chmod +x /entrypoint.sh
WORKDIR /src/app
#Install requirements pre-startup to reduce entrypoint time
RUN pip install -r requirements.txt
ENTRYPOINT [ "/entrypoint.sh" ]
最后是我的entrypoint.sh
#! /bin/bash
cd /src/app || exit
echo "PIP INSTALLATION" && pip install -r requirements.txt
echo "UPGRADE" && python manage.py migrate
# echo "uwsgi" && uwsgi "uwsgi.ini"
我做 django-compose build
,它构建了图像。但是当我做 docker-compose up
django_1 exited with code 0
.
但是,如果我取消注释 entrypoint.sh 的最后一行,它 运行 就很好了。
有人可以帮我理解背后的原因吗?
AFAIU,当你取消注释入口点的最后一行时,容器不再有前台进程可以保持它 & 运行,因此它以状态 0 退出。入口点必须有前台保持容器运行的过程 & 运行。此外,您正在多次执行 "pip install"。这一步应该只在 Dockerfile 中。
尝试在 entrypoint.sh
中移动 python manage.py runserver 0.0.0.0:8000
。
更新 -
在端口冲突的情况下,容器将不会以状态 0 退出,端口冲突错误将出现在 STDOUT 中。此外,当他取消注释时,就不会发生端口冲突。所以,前台进程似乎根本没有被执行。
如果你想让容器保持 运行ning,你需要:
- 运行 一个前台进程
- 通过 --ti
连接到它的终端
您需要连接终端以查看在未执行 uwsgi 时 python 命令是否失败,从而停止容器
当您同时拥有命令和入口点时,Docker 运行s 只有入口点,并将命令作为参数传递给它。请参阅 Docker 文件文档中的 Understand how CMD and ENTRYPOINT interact。一旦入口点退出,容器就结束了;它可以对命令部分做任何它喜欢的事情,包括完全忽略它。
典型的做法是用
结束入口点脚本
exec "$@"
这导致它只接受它的命令行参数,运行它们作为命令,将入口点脚本替换为主容器进程。
如果没有这个,您将到达入口点脚本的末尾,并且容器已完成它被告知要做的所有事情,因此它成功退出(状态代码 0)。
我对 Docker 很陌生。我正在尝试 运行 Django on Docker。以下是我的 docker-compose 文件。
version: '2'
services:
django:
build:
context: .
dockerfile: ./deploy/dev/Dockerfile
tty: true
command: python manage.py runserver 0.0.0.0:8000
ports:
- "8000:8000"
volumes:
- ./app:/src/app
depends_on:
- "workflow_db"
- "rabbitmq"
env_file:
- ./deploy/dev/envvar.env
workflow_db:
image: postgres:9.6
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=hello_django
- POSTGRES_PASSWORD=hello_django
- POSTGRES_DB=hello_django
rabbitmq:
image: "rabbitmq:3-management"
hostname: "rabbitmq"
environment:
RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
RABBITMQ_DEFAULT_USER: "rabbitmq"
RABBITMQ_DEFAULT_PASS: "rabbitmq"
RABBITMQ_DEFAULT_VHOST: "/"
ports:
- "15672:15672"
- "5672:5672"
volumes:
postgres_data:
Docker文件
FROM python:3.7-alpine
RUN apk update && apk add --no-cache gcc libffi-dev g++ python-dev build-base linux-headers postgresql-dev postgresql postgresql-contrib pcre-dev bash alpine-sdk \
&& pip install wheel
#Copy over application files
COPY ./app /src/app
#Copy over, and grant executable permission to the startup script
COPY ./deploy/dev/entrypoint.sh /
RUN chmod +x /entrypoint.sh
WORKDIR /src/app
#Install requirements pre-startup to reduce entrypoint time
RUN pip install -r requirements.txt
ENTRYPOINT [ "/entrypoint.sh" ]
最后是我的entrypoint.sh
#! /bin/bash
cd /src/app || exit
echo "PIP INSTALLATION" && pip install -r requirements.txt
echo "UPGRADE" && python manage.py migrate
# echo "uwsgi" && uwsgi "uwsgi.ini"
我做 django-compose build
,它构建了图像。但是当我做 docker-compose up
django_1 exited with code 0
.
但是,如果我取消注释 entrypoint.sh 的最后一行,它 运行 就很好了。
有人可以帮我理解背后的原因吗?
AFAIU,当你取消注释入口点的最后一行时,容器不再有前台进程可以保持它 & 运行,因此它以状态 0 退出。入口点必须有前台保持容器运行的过程 & 运行。此外,您正在多次执行 "pip install"。这一步应该只在 Dockerfile 中。
尝试在 entrypoint.sh
中移动 python manage.py runserver 0.0.0.0:8000
。
更新 -
在端口冲突的情况下,容器将不会以状态 0 退出,端口冲突错误将出现在 STDOUT 中。此外,当他取消注释时,就不会发生端口冲突。所以,前台进程似乎根本没有被执行。
如果你想让容器保持 运行ning,你需要:
- 运行 一个前台进程
- 通过 --ti 连接到它的终端
您需要连接终端以查看在未执行 uwsgi 时 python 命令是否失败,从而停止容器
当您同时拥有命令和入口点时,Docker 运行s 只有入口点,并将命令作为参数传递给它。请参阅 Docker 文件文档中的 Understand how CMD and ENTRYPOINT interact。一旦入口点退出,容器就结束了;它可以对命令部分做任何它喜欢的事情,包括完全忽略它。
典型的做法是用
结束入口点脚本exec "$@"
这导致它只接受它的命令行参数,运行它们作为命令,将入口点脚本替换为主容器进程。
如果没有这个,您将到达入口点脚本的末尾,并且容器已完成它被告知要做的所有事情,因此它成功退出(状态代码 0)。