【问题标题】:docker-compose run: django and postgres "strange" behaviordocker-compose 运行:django 和 postgres “奇怪”的行为
【发布时间】:2021-09-30 10:47:07
【问题描述】:

当我运行以下命令时:

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

我绞尽脑汁想了几天,但找不到这种行为的解释。

【问题讨论】:

  • 入口点脚本开头的三个bash 行是什么? (如果你输入exit 三次,你的docker-compose run 容器是否符合你的预期?)
  • 我注释掉了三个bash 行。现在它会自动退出。 docker compose run django ./manage.py startapp createsuperuser [+] Running 1/1 ⠿ Container django-tailwind-docker_postgres_1 Recreated 10.3s [+] Running 1/1 ⠿ Container django-tailwind-docker_postgres_1 Started 0.6s PostgreSQL is available ~/Dev/p/django-tailwind-docker ibb.co/k3Qb0LK

标签: python-3.x django docker docker-compose django-postgresql


【解决方案1】:

实际上它并没有打开 postgres shell。它说依赖于 postgres 的容器正在运行。显示的路径是/usr/src/app/,就像在您的 django 组件中一样。您还可以在 bash 行 '7fbcde....' 中检查 django 应用程序的哈希值和哈希值

【讨论】:

  • 感谢您的回复。我对 Docker 及其配置比较陌生。如何使用run 获得与exec 相同的结果?
  • 输入 docker-compose run django 然后:python manage.py createsuperuser
  • 当我使用docker-compose run django时,它会执行“入口点”并在端口8000上启动开发环境。从那里我只能退出。如果我打开一个新终端并尝试python manage.py createsuperuser,它将不再有效。
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多