我想为我的 Django 项目 mysite 创建一个 Docker 映像,它有两个应用程序轨道和用户。我使用 docker build -t mysite 来构建我的 docker 镜像。我写了一个 Dockerfile 就像它在 dockerhub 上所说的那样。然后我创建了 docker-compose.yml 文件和我在 docker-compose 文件中使用的 bash 脚本entypoint.sh。
这些是我的文件:
Dockerfile:
FROM django:onbuild
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
docker-compose.yml:
version: '3'
services:
db:
image: postgres
container_name: postgres_container
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
ports:
- 5432:5432
web:
image: mysite:latest
build:
context: .
dockerfile: Dockerfile
container_name: mysite_container
ports:
- "8000:8000"
depends_on:
- db
entrypoint: /entrypoint.sh
入口点.sh
#!/bin/sh
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
exec "$@"
所以当我想启动整个容器时,我使用了以下命令
docker build .
docker-compose build
docker-compose up
而我的 postgres_containter 启动成功,但是 mysite_container 抛出以下错误:
mysite_container | Traceback (most recent call last):
mysite_container | File "manage.py", line 22, in <module>
mysite_container | execute_from_command_line(sys.argv)
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
mysite_container | utility.execute()
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 365, in execute
mysite_container | self.fetch_command(subcommand).run_from_argv(self.argv)
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/core/management/base.py", line 288, in run_from_argv
mysite_container | self.execute(*args, **cmd_options)
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/core/management/base.py", line 335, in execute
mysite_container | output = self.handle(*args, **options)
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 79, in handle
mysite_container | executor = MigrationExecutor(connection, self.migration_progress_callback)
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/migrations/executor.py", line 18, in __init__
mysite_container | self.loader = MigrationLoader(self.connection)
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/migrations/loader.py", line 49, in __init__
mysite_container | self.build_graph()
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/migrations/loader.py", line 207, in build_graph
mysite_container | self.applied_migrations = recorder.applied_migrations()
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/migrations/recorder.py", line 61, in applied_migrations
mysite_container | if self.has_table():
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/migrations/recorder.py", line 44, in has_table
mysite_container | return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 255, in cursor
mysite_container | return self._cursor()
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 232, in _cursor
mysite_container | self.ensure_connection()
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
mysite_container | self.connect()
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/utils.py", line 89, in __exit__
mysite_container | raise dj_exc_value.with_traceback(traceback) from exc_value
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
mysite_container | self.connect()
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 194, in connect
mysite_container | self.connection = self.get_new_connection(conn_params)
mysite_container | File "/usr/local/lib/python3.4/site-packages/django/db/backends/postgresql/base.py", line 168, in get_new_connection
mysite_container | connection = Database.connect(**conn_params)
mysite_container | File "/usr/local/lib/python3.4/site-packages/psycopg2/__init__.py", line 130, in connect
mysite_container | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
mysite_container | django.db.utils.OperationalError: could not connect to server: Connection refused
mysite_container | Is the server running on host "localhost" (127.0.0.1) and accepting
mysite_container | TCP/IP connections on port 5432?
mysite_container | could not connect to server: Cannot assign requested address
mysite_container | Is the server running on host "localhost" (::1) and accepting
mysite_container | TCP/IP connections on port 5432?
我在 settings.py 中的数据库是
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'localhost',
'PORT': '5432',
}
}
那么,有谁知道我为什么会收到此错误?当我执行 docker-compose up 时,我的 postgres 在端口 5432 上的本地主机上成功运行,但似乎我的 web 容器没有检测到。我应该在 Docker 文件中更改什么才能正确运行 mysite_container?
编辑:现在我添加了新的 settings_docker.py,我将我的主机设置为 'db' 文件,并将环境变量 DOCKER_SETTINGS_MODULE=mysite.settins_docker 添加到我在 docker-compose.yml 中的 Web 服务,并且容器正常启动,但我没有我的数据库关系。那么,如何将这些关系迁移到 docker?
我将在这里暗中拍摄并说您的DATABASES
设置不正确settings.py
。
它需要类似于:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': '5432',
}
}
编辑:docker-compose.yml
直接从上面的链接改编的文件:
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
web:
image: mysite:latest
build:
context: .
dockerfile: Dockerfile
container_name: mysite_container
ports:
- "8000:8000"
depends_on:
- db
entrypoint: /entrypoint.sh
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句