我对Docker和Web开发都是新手。当尝试容器化我的django项目时,我遇到了一个错误,并且几天都无法解决它。这个错误可能很愚蠢,但我找不到解决方案。如果有人帮我解决这个问题,我会很高兴的。先谢谢你。作为操作系统,我使用Ubuntu 22.04
以下是执行docker compose build
和docker compose up
命令后的输出:
[+] Running 2/0
⠿ Container test_task-db_task-1 Created 0.0s
⠿ Container test_task_container Created 0.0s
Attaching to test_task-db_task-1, test_task_container
test_task-db_task-1 |
test_task-db_task-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
test_task-db_task-1 |
test_task-db_task-1 | 2023-06-07 10:46:07.124 UTC [1] LOG: starting PostgreSQL 14.1 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20211027) 10.3.1 20211027, 64-bit
test_task-db_task-1 | 2023-06-07 10:46:07.125 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
test_task-db_task-1 | 2023-06-07 10:46:07.125 UTC [1] LOG: listening on IPv6 address "::", port 5432
test_task-db_task-1 | 2023-06-07 10:46:07.147 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
test_task-db_task-1 | 2023-06-07 10:46:07.163 UTC [21] LOG: database system was shut down at 2023-06-07 10:45:29 UTC
test_task-db_task-1 | 2023-06-07 10:46:07.218 UTC [1] LOG: database system is ready to accept connections
test_task_container | Watching for file changes with StatReloader
test_task_container | Exception in thread django-main-thread:
test_task_container | Traceback (most recent call last):
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
test_task_container | self.connect()
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
test_task_container | return func(*args, **kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
test_task_container | self.connection = self.get_new_connection(conn_params)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
test_task_container | return func(*args, **kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
test_task_container | connection = self.Database.connect(**conn_params)
test_task_container | File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
test_task_container | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
test_task_container | psycopg2.OperationalError: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
test_task_container | Is the server running locally and accepting connections on that socket?
test_task_container |
test_task_container |
test_task_container | The above exception was the direct cause of the following exception:
test_task_container |
test_task_container | Traceback (most recent call last):
test_task_container | File "/usr/local/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
test_task_container | self.run()
test_task_container | File "/usr/local/lib/python3.10/threading.py", line 953, in run
test_task_container | self._target(*self._args, **self._kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper
test_task_container | fn(*args, **kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 136, in inner_run
test_task_container | self.check_migrations()
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 574, in check_migrations
test_task_container | executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 18, in __init__
test_task_container | self.loader = MigrationLoader(self.connection)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 58, in __init__
test_task_container | self.build_graph()
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 235, in build_graph
test_task_container | self.applied_migrations = recorder.applied_migrations()
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 81, in applied_migrations
test_task_container | if self.has_table():
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 57, in has_table
test_task_container | with self.connection.cursor() as cursor:
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
test_task_container | return func(*args, **kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 330, in cursor
test_task_container | return self._cursor()
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 306, in _cursor
test_task_container | self.ensure_connection()
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
test_task_container | return func(*args, **kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 288, in ensure_connection
test_task_container | with self.wrap_database_errors:
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/utils.py", line 91, in __exit__
test_task_container | raise dj_exc_value.with_traceback(traceback) from exc_value
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
test_task_container | self.connect()
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
test_task_container | return func(*args, **kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
test_task_container | self.connection = self.get_new_connection(conn_params)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
test_task_container | return func(*args, **kwargs)
test_task_container | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
test_task_container | connection = self.Database.connect(**conn_params)
test_task_container | File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
test_task_container | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
test_task_container | django.db.utils.OperationalError: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
test_task_container | Is the server running locally and accepting connections on that socket?
test_task_container |
下面是我的docker-compose文件:
services:
task:
build: .
volumes:
- .:/test_task
ports:
- 8000:8000
image: app:django
container_name: test_task_container
command: python manage.py runserver 0.0.0.0:8000
db_task:
image: postgres:14.1-alpine
restart: always
env_file:
- .env
ports:
- '5432:5432'
volumes:
- db:/var/lib/postgresql/data
volumes:
db:
driver: local
下面是dockerfile本身:
FROM python:3.10-slim-buster
ENV PYTHONBUFFERED=1
WORKDIR /test_task
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
.env文件:
POSTGRES_HOST=db
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres
DJANGO_SETTINGS_MODULE=core.settings
以及www.example.com中的数据库设置settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': os.getenv('POSTGRES_HOST'),
'PORT': os.getenv('POSTGRES_PORT'),
'USER': os.getenv('POSTGRES_USER'),
'PASSWORD': os.getenv('POSTGRES_PASSWORD'),
'NAME': os.getenv('POSTGRES_DB')
}
}
我试图容器化我的项目,并在我的本地服务器上打开它
1条答案
按热度按时间iaqfqrcu1#
需要考虑的几件事:
POSTGRES_HOST
应为"db_task"
.env
与docker-compose.yaml
位于相同的位置,则应自动拾取.env
。因此,为了保持一致性,请为两者指定env_file
,或者都不指定。depends_on
添加到task
服务,以便在数据库准备就绪之前不会启动应用程序: