【发布时间】:2020-06-26 20:57:52
【问题描述】:
以下 docker-compose.yml 有效:
version: "3.8"
services:
my_db:
container_name: my_db
image: postgres
environment:
- POSTGRES_DB=ArborMetrix
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=753951456852
# volumes:
# - type: volume
# source: my_db_volume
# target: /my_project
web_app:
container_name: web_app
build: .
command: bash -c "python manage.py makemigrations &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
# volumes:
# - type: volume
# source: web_app_volume
# target: /my_project
ports:
- "8000:8000"
depends_on:
- my_db
#volumes:
# my_db_volume:
# web_app_volume:
当我取消注释上面的 cmets 以实现卷时,我收到以下错误:
Starting my_db ... done
Starting web_app ... done
Attaching to my_db, web_app
my_db |
my_db | PostgreSQL Database directory appears to contain a database; Skipping initialization
my_db |
my_db | 2020-06-26 18:47:07.281 UTC [1] LOG: starting PostgreSQL 12.3 (Debian 12.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
my_db | 2020-06-26 18:47:07.282 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
my_db | 2020-06-26 18:47:07.283 UTC [1] LOG: listening on IPv6 address "::", port 5432
my_db | 2020-06-26 18:47:07.314 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
my_db | 2020-06-26 18:47:07.448 UTC [25] LOG: database system was shut down at 2020-06-26 18:46:48 UTC
my_db | 2020-06-26 18:47:07.484 UTC [1] LOG: database system is ready to accept connections
web_app | Traceback (most recent call last):
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection
web_app | self.connect()
web_app | File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
web_app | return func(*args, **kwargs)
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 197, in connect
web_app | self.connection = self.get_new_connection(conn_params)
web_app | File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
web_app | return func(*args, **kwargs)
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 185, in get_new_connection
web_app | connection = Database.connect(**conn_params)
web_app | File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
web_app | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
web_app | psycopg2.OperationalError: could not connect to server: Connection refused
web_app | Is the server running on host "127.0.0.1" and accepting
web_app | TCP/IP connections on port 5432?
web_app |
web_app |
web_app | The above exception was the direct cause of the following exception:
web_app |
web_app | Traceback (most recent call last):
web_app | File "manage.py", line 21, in <module>
web_app | main()
web_app | File "manage.py", line 17, in main
web_app | execute_from_command_line(sys.argv)
web_app | File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
web_app | utility.execute()
web_app | File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
web_app | self.fetch_command(subcommand).run_from_argv(self.argv)
web_app | File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 328, in run_from_argv
web_app | self.execute(*args, **cmd_options)
web_app | File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 369, in execute
web_app | output = self.handle(*args, **options)
web_app | File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
web_app | res = handle_func(*args, **kwargs)
web_app | File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py", line 101, in handle
web_app | loader.check_consistent_history(connection)
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 283, in check_consistent_history
web_app | applied = recorder.applied_migrations()
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 76, in applied_migrations
web_app | if self.has_table():
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 56, in has_table
web_app | return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
web_app | File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
web_app | return func(*args, **kwargs)
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 260, in cursor
web_app | return self._cursor()
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 236, in _cursor
web_app | self.ensure_connection()
web_app | File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
web_app | return func(*args, **kwargs)
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection
web_app | self.connect()
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
web_app | raise dj_exc_value.with_traceback(traceback) from exc_value
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection
web_app | self.connect()
web_app | File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
web_app | return func(*args, **kwargs)
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 197, in connect
web_app | self.connection = self.get_new_connection(conn_params)
web_app | File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
web_app | return func(*args, **kwargs)
web_app | File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 185, in get_new_connection
web_app | connection = Database.connect(**conn_params)
web_app | File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
web_app | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
web_app | django.db.utils.OperationalError: could not connect to server: Connection refused
web_app | Is the server running on host "127.0.0.1" and accepting
web_app | TCP/IP connections on port 5432?
web_app |
web_app exited with code 1
参考资料:
在 Dockerfile 中:
FROM python
ENV PYTHONUNBUFFERED 1
ENV COMPOSE_CONVERT_WINDOWS_PATHS=1
RUN mkdir /my_project
WORKDIR /my_project
COPY . /my_project
RUN pip install -r requirements.txt
在 settings.py 中:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "ArborMetrix",
"USER": "postgres",
"PASSWORD": "753951456852",
"HOST": "my_db",
"PORT": "5432",
}
}
【问题讨论】:
-
你确定是这个原因,你的卷?您收到
could not connect to server: Connection refused这意味着您的应用程序无法运行查询,因为它们无法连接到数据库。这是您日志的另一部分:Is the server running on host "127.0.0.1" and accepting web_app | TCP/IP connections on port 5432? -
web_app 的卷正在用命名卷覆盖工作目录 /my_project。您确定不想挂载本地目录吗?
-
您确定要挂载任何东西吗?如果您照常删除
volumes:,那么您正在运行构建到映像中的代码,这通常是您想要的。 -
@IainShelvington 感谢 Iain 的提示,我已经解决了这个问题。我将发布我的解决方案。
-
@DavidMaze 我听说数据库服务需要一个卷来在重复打开的容器中保存数据。这不是真的吗?
标签: django docker docker-compose dockerfile