我找不到解决方案,请帮忙!
我有 Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED=1
RUN mkdir /app
WORKDIR /app
RUN pip install Django \
&& pip install psycopg2 \
&& pip install jinja2 \
&& pip install Pillow
COPY . /app/
和 docker-compose.yaml
version: "3"
services:
db:
image: postgres
environment:
- POSTGRES_DB=folivora
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
site:
image: folivora:latest
command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/app
depends_on:
- db
ports:
- 8000:8000
和 settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'folivora',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': '5432',
}
}
在运行“ docker-compose up”时出现错误
site_1 | django.db.utils.OperationalError: could not connect to server: Connection refused
site_1 | Is the server running on host "db" (192.168.224.2) and accepting
site_1 | TCP/IP connections on port 5432?
当我编辑docker-compose.yaml时,将字符串命令更改为:
command: bash -c "python manage.py runserver 0.0.0.0:8000"
一切都很好。因此,迁移行破坏了我的代码,但我不知道为什么。
我尝试创建一个空的django项目来检查相同的配置。在第一个“ docker-compose up”上,所有程序都开始正常运行,但是从第二个开始,所有程序又因相同的错误而中断。随着时间的流逝,这个问题从测试项目中消失了,我不知道为什么,maby缓存之类的东西。
新信息
在docer-compose.yaml中使用命令docker-compose up
运行command: bash -c "python manage.py runserver 0.0.0.0:8000"
并捕获错误。
然后按Ctrl + C(从docker退出,组成“ shell”),但不要执行docker-compose down
,因为此命令将删除创建的容器。
在docer-compose.yaml中使用命令docker-compose up
运行command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
,所有操作均已成功启动。
我认为这是不好的解决方法。
答案 0 :(得分:1)
根据您的编辑,您没有任何网络问题。
问题在于您的Django应用程序在数据库实际运行之前就开始调用迁移命令(您可以在postgres日志中进行检查)。还要注意,depends_to
仅管理容器的创建顺序,而不是容器的准备状态。
您可以使用wait-for-it
等到您的postgres端口可用。因此,您的command
将是:
bash -c "wait-for-it db:5432 -- python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
如果您的映像未安装此软件包,请向您的Dockerfile添加apt install wait-for-it
。