我正在尝试对我的 Django-postgres 应用进行 docker 化,并使用 docker-compose 运行 2 个命令 我的 Dockerfile 是:
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
我的 docker-compose.yml 是:
version: '3'
services:
web:
build: .
command: bash -c "python app/manage.py migrate && python app/manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: password
我的设置 .py 具有以下数据库代码:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'password',
'HOST': 'db',
'PORT': '5432',
}
}
当我运行时,我的数据库和网络容器已经启动:
docker-compose run web python app/manage.py migrate
docker-compose run web python app/manage.py runserver 0.0.0.0:8000
但是当我运行的时候
docker-compose up
它因错误而失败:
web_1 | django.db.utils.OperationalError: could not connect to server: Connection refused web_1 | Is the server running on host "db" (172.23.0.2) and accepting web_1 | TCP/IP connections on port 5432?
谁能帮我找出我哪里出错了?
请您参考如下方法:
这里的问题是 docker-compose up 不会等到 db 运行。
你可以使用wait-for-it.sh , 请参阅 this
例子:
command: ["/code/wait-for-it.sh", "db:5432", "--", "python", "MY_CODE"]
docker 文件:
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh \
&& chmod +x wait-for-it.sh
或者沉睡在你的命令中:
command: bash -c "sleep 60 && python app/manage.py migrate && python app/manage.py runserver 0.0.0.0:8000"
附言
我可以看到您使用 ADD 。/code/ 和 volumes: - .:/code ,所以你需要删除 ADD 。/code/ 因为它将被卷覆盖,但是你需要在另一个路径中安装 wait-for-it.sh
