我的django项目无法连接到postgres数据库容器。我应该怎么做?
它在命令Bob:
- Football: 0
Julia:
- Football: 1
- Golf: 38
Kevin:
- Football: 47
- Golf: 0
- Tennis: 124
上崩溃了。
我知道docker run命令会创建一个新容器但我有更多命令
一个由bash在docker-compose.yml中。它应该有效,不应该吗?
我的python manage.py collectstatic --noinput && python manage.py makemigrations blog && python manage.py migrate
:
Dockerfile
我的FROM python:3.6-alpine
MAINTAINER Name <name@domain>
ENV PYTHONUNBUFFERED 1
ENV INSTALL_PATH /heckblog
RUN mkdir -p $INSTALL_PATH
WORKDIR $INSTALL_PATH
COPY requirements.txt requirements.txt
# make available run pip install psycopg2
RUN apk update && \
apk add --virtual build-deps gcc python3-dev musl-dev && \
apk add postgresql-dev
RUN pip3 install -r requirements.txt
# add bash into alpine linux
RUN apk add --update bash && rm -rf /var/cache/apk/*
COPY ./heckblog .
#RUN pip install .
CMD gunicorn -b 0.0.0.0:8000 --access-logfile - "config.wsgi:application"
:
docker-compose.yml
version: '2'
services:
db:
image: postgres:alpine
environment:
POSTGRES_USER: blogdmin
POSTGRES_PASSWORD: password
POSTGRES_DB: heckblog
PGDATA: /tmp/pgdata
volumes:
- postgres_data:/tmp/pgdata
web:
build: .
command: >
bash -c "sleep 10 &&
python manage.py collectstatic --noinput &&
python manage.py makemigrations blog &&
python manage.py migrate &&
echo \"from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')\" | python manage.py shell &&
gunicorn -b 0.0.0.0:8000 --access-logfile - --reload \"config.wsgi:application\""
volumes:
- ./heckblog:/heckblog
depends_on:
- db
environment:
IN_DOCKER: 1
ports:
- "80:8000"
volumes:
postgres_data:
:
settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'heckblog',
'USER': 'blogdmin',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '', # default port
}
}
...
的输出:
docker-compose up --build
我用: Windows 10 Docker 17.03.0-ce-win1-(10296) docker-compose版本1.11.2 Django的== 1.10.6 psycopg2 == 2.7.1。
感谢您的回答
答案 0 :(得分:8)
默认情况下,docker中的每个容器都有自己的主机名和IP。当compose为您旋转容器时,默认情况下它还会将所有容器放在网络上,以允许基于DNS的发现。
这意味着您的数据库无法在localhost上访问,但您可以通过服务名称&#34; db&#34;来访问它。在settings.py中更改此行:
'HOST': 'localhost',
为:
'HOST': 'db',
答案 1 :(得分:1)
这对我有用:
撰写:
version: '3.7'
services:
web:
build: .
command: python /code/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- 8000:8000
environment:
- DB_HOST=db
- DB_NAME=web
- DB_USER=postgres
- DB_PASSWORD=postgres
depends_on:
- db
db:
image: postgres:12-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_DB=web
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
postgres_data:
在设置中:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('DB_NAME'),
'USER':os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST':os.environ.get('DB_HOST'),
'PORT':5432,
}
}