python-3.x - docker-compose 运行:django 和 postgres “奇怪”的行为
问题描述
当我运行以下命令时:
docker-compose run django python manage.py startapp hello
或者
docker-compose run django python manage.py createsuperuser
它不是启动一个新容器,而是打开一个 Postgres shell。
但是,当我使用时exec
,像这样:
docker-compose exec django python manage.py createsuperuser
然后它按预期工作。
这是我的docker-compose.yml
文件:
version: '3.7'
services:
postgres:
image: 'postgres:9.6.9-alpine'
volumes:
- postgres_data:/var/lib/postgresql/data
env_file:
- ./.env.dev
django:
image: django_dev
build:
context: .
dockerfile: ./app/docker/django/Dockerfile
volumes:
- ./app/:/usr/src/app/
command: /usr/src/app/docker/django/start_dev
ports:
- 8000:8000
env_file:
- ./.env.dev
depends_on:
- postgres
node:
image: node_dev
build:
context: .
dockerfile: ./app/docker/node/Dockerfile
depends_on:
- django
volumes:
- ./app/:/usr/src/app/
- /usr/src/app/node_modules
command: npm run dev
ports:
- '3000:3000'
- "3001:3001"
volumes:
postgres_data:
Dockerfile
:
FROM python:3.9.5-slim-buster
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt update \
&& apt install -y curl \
&& curl -sL https://deb.nodesource.com/setup_lts.x | bash - \
&& apt-get -y install libpq-dev gcc \
&& pip install psycopg2 \
&& pip install psycopg2-binary
RUN pip install --upgrade pip \
&& pip install pipenv
COPY ./app/Pipfile /usr/src/app/Pipfile
RUN pipenv install --skip-lock --system --dev
RUN apt-get update && apt-get install -y libglu1
COPY ./app/docker/django/entrypoint /usr/src/app/docker/django/entrypoint
COPY ./app/docker/django/start_dev /usr/src/app/docker/django/start_dev
RUN sed -i 's/\r$//g' /usr/src/app/docker/django/start_dev
RUN chmod +x /usr/src/app/docker/django/start_dev
COPY . /usr/src/app/
ENTRYPOINT ["/usr/src/app/docker/django/entrypoint"]
entrypoint
:
#!/bin/sh
bash | set -o errexit
bash | set +o pipefail
bash | set -o nounset
if [ -z "${POSTGRES_USER}" ]; then
base_postgres_image_default_user='postgres'
export POSTGRES_USER="${base_postgres_image_default_user}"
fi
export DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
postgres_ready() {
python << END
import sys
import psycopg2
try:
psycopg2.connect(
dbname="${POSTGRES_DB}",
user="${POSTGRES_USER}",
password="${POSTGRES_PASSWORD}",
host="${POSTGRES_HOST}",
port="${POSTGRES_PORT}",
)
except psycopg2.OperationalError:
sys.exit(-1)
sys.exit(0)
END
}
until postgres_ready; do
>&2 echo 'Waiting for PostgreSQL to become available...'
sleep 1
done
>&2 echo 'PostgreSQL is available'
exec "$@"
start_dev
:
#!/bin/sh
bash | set -o errexit
bash | set +o pipefail
bash | set -o nounset
python manage.py flush --no-input
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser --noinput
python manage.py runserver 0.0.0.0:8000
我绞尽脑汁几天,但找不到这种行为的解释。
解决方案
Actually it is not opening postgres shell. It said that depended cotainer with postgres is running. A path that showed is /usr/src/app/
as in your django component. You can also checked hash of your django app and hash in bash line '7fbcde....'
推荐阅读
- typescript - Typescript - 默认泛型为另一个泛型的属性
- javascript - 如何根据特定键的值访问数组中的对象?
- javascript - 在 React 组件中使用双箭头函数处理模糊
- python - 如何在 Flask SQLAlchemy 中从具有 2 个主键的表中查询一行?
- javascript - 与 javascript Promise 斗争
- c - 如何跟踪 pthread C
- f# - 在 f# 中发送记录时 Seq.map 错误
- node.js - 开放层 - 将点格式化为多面体
- node.js - 成员计数频道显示为 0 个成员
- python - 以字典为参数的 Python 多处理问题