【问题标题】:docker-compose does not start postgres imagedocker-compose 不启动 postgres 图像
【发布时间】:2015-07-16 03:01:00
【问题描述】:

我正在为 django 应用程序创建一个 docker-compose 配置,Dockerfile 构建成功,但是当我组合它们时,django 返回一个问题——无法连接到 posgres。

我运行docker-compose run web bash,发现redis和posgres都无法连接。

我的 docker-compose.yml 文件:

db:
  image: postgres:9.1
  environment:
    - POSTGRES_PASSWORD=mysecretpassword

redis:
    image: redis:2.8

web:
  links:
    - db
    - redis
  build: .
  volumes:
    - .:/workspace
  ports:
    - "8000:8000“
  command: python /workspace/BreadTripServer/webapps/manage.py runserver 0.0.0.0:8000 --settings=configs.local_default

docker-compose up 时的错误信息:

sudo docker-compose up
Recreating breadtrip_db_1...
Recreating breadtrip_redis_1...
Recreating breadtrip_web_1...
Attaching to breadtrip_redis_1, breadtrip_web_1
redis_1 | [1] 06 May 06:07:30.469 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

... 

redis_1 | [1] 06 May 06:07:30.490 # Server started, Redis version 2.8.19
redis_1 | [1] 06 May 06:07:30.490 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | [1] 06 May 06:07:30.490 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | [1] 06 May 06:07:30.491 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | [1] 06 May 06:07:30.491 * DB loaded from disk: 0.000 seconds
redis_1 | [1] 06 May 06:07:30.491 * The server is now ready to accept connections on port 6379
web_1   | Traceback (most recent call last):
web_1   |   File "/workspace/BreadTripServer/webapps/manage.py", line 14, in <module>
web_1   |     execute_manager(settings)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 438, in execute_manager
web_1   |     utility.execute()
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 379, in execute
web_1   |     self.fetch_command(subcommand).run_from_argv(self.argv)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 191, in run_from_argv
web_1   |     self.execute(*args, **options.__dict__)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 209, in execute
web_1   |     translation.activate('en-us')
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/__init__.py", line 100, in activate
web_1   |     return _trans.activate(language)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 202, in activate
web_1   |     _active.value = translation(language)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 185, in translation
web_1   |     default_translation = _fetch(settings.LANGUAGE_CODE)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/utils/translation/trans_real.py", line 162, in _fetch
web_1   |     app = import_module(appname)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
web_1   |     __import__(name)
web_1   |   File "/workspace/BreadTripServer/webapps/lib/haystack/__init__.py", line 83, in <module>
web_1   |     backend = load_backend(settings.HAYSTACK_SEARCH_ENGINE)
web_1   |   File "/workspace/BreadTripServer/webapps/lib/haystack/__init__.py", line 57, in load_backend
web_1   |     return importlib.import_module('haystack.backends.%s_backend' % backend_name)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
web_1   |     __import__(name)
web_1   |   File "/workspace/BreadTripServer/webapps/lib/haystack/backends/__init__.py", line 6, in <module>
web_1   |     from django.db.models import Q
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/db/__init__.py", line 78, in <module>
web_1   |     connection = connections[DEFAULT_DB_ALIAS]
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __getitem__
web_1   |     conn = backend.DatabaseWrapper(db, alias)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/db/backends/postgis/base.py", line 11, in __init__
web_1   |     self.ops = PostGISOperations(self)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/db/backends/postgis/operations.py", line 91, in __init__
web_1   |     vtup = self.postgis_version_tuple()
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/db/backends/postgis/operations.py", line 445, in postgis_version_tuple
web_1   |     version = self.postgis_lib_version()
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/db/backends/postgis/operations.py", line 425, in postgis_lib_version
web_1   |     return self._get_postgis_func('postgis_lib_version')
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/db/backends/postgis/operations.py", line 406, in _get_postgis_func
web_1   |     cursor = self.connection._cursor()
web_1   |   File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 140, in _cursor
web_1   |     self.connection = Database.connect(**conn_params)
web_1   |   File "/usr/local/lib/python2.7/dist-packages/psycopg2/__init__.py", line 179, in connect
web_1   |     connection_factory=connection_factory, async=async)
web_1   | psycopg2.OperationalError: could not connect to server: Connection refused
web_1   |   Is the server running on host "localhost" (::1) and accepting
web_1   |   TCP/IP connections on port 5432?
web_1   | could not connect to server: Connection refused
web_1   |   Is the server running on host "localhost" (127.0.0.1) and accepting
web_1   |   TCP/IP connections on port 5432?
web_1   | 
breadtrip_web_1 exited with code 1

更新:

因为我设置了指向其他图像的链接,docker 链接了主机 172.17.0.67 上的 pg,我需要将 pg 主机设置为 docker 官方文档中未提及的那个地址。 (这个地址每次都会改变,但是可以通过env获取)

现在,我遇到了另一个问题:

web_1   | Unknown command: 'runserver'
web_1   | Type 'manage.py help' for usage.
breadtrip_web_1 exited with code 1

如果我将命令python /workspace/BreadTripServer/webapps/manage.py runserver 0.0.0.0:8000 --settings=configs.local_default 更改为python /workspace/BreadTripServer/webapps/manage.py runserver,它可以正常工作,但我无法访问网页。

【问题讨论】:

    标签: django postgresql docker docker-compose


    【解决方案1】:

    我遇到了这个问题,这只是因为我使用的是 VPN。如果您使用的是 sshuttle 之类的东西,只需将其关闭即可。

    【讨论】:

      【解决方案2】:

      当我遇到这个 SO 答案时,我遇到了这个问题并且正在抓住稻草:django.db.utils.OperationalError Could not connect to server

      对我有用的解决方案是使用

      杀死所有 postgres 进程
      sudo pkill postgres
      

      【讨论】:

        【解决方案3】:

        在您的 BUILD 树的某处可能有一个名为 settings.py 的文件。你可以通过输入命令找到它:

        find . -name settings.py
        

        找到后,您需要编辑该文件。它看起来像这样:

        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
                'NAME': 'mydb',                      # Or path to database file if using sqlite3.
                # The following settings are not used with sqlite3:
                'USER': 'myuser',
                'PASSWORD': 'password',
                'HOST': 'localhost',                      # Empty for localhost through domain sockets or           '127.0.0.1' for localhost through TCP.
                'PORT': '',                      # Set to empty string for default.
            }
        }
        

        看到“本地主机”了吗?将其更改为“db”(正如@Adrian 建议的那样),您将解决此问题。 (好吧,你将继续下一个问题 :-))你应该感谢 Adrian 的答案。

        【讨论】:

        • 但是为什么我不能通过python /workspace/BreadTripServer/webapps/manage.py runserver 0.0.0.0:8000 --settings=configs.local_default启动我的网站
        • 我不知道。您的组件配置错误。要正确配置它们,需要修改配置以正确使用提供的链接(/etc/hosts 或 env 变量)变量。您提供的回溯显然试图在 localhost 打开 postgres,postgres 不在 localhost,postgres 在 db。你说这是官方demo。你能提供breadtripserver官方demo的链接吗,我可以看看那里有什么问题。
        • 你是对的!现在我正在处理下一个问题。
        【解决方案4】:

        看起来您的应用程序正在寻找localhost 上的数据库。它应该在主机db 上查找数据库(主机名将通过链接参数添加到/etc/hosts)。

        【讨论】:

        • 这是官方demo的样子,我需要做些什么来正确设置主机
        • 我不知道你的源代码是什么样子的。在代码中会有一个连接到数据库的点。您需要将其设置为“db”。当前可能设置为“localhost”或“127.0.0.1”,也可能未指定。
        • 因为我设置了链接,docker在主机172.17.0.67上链接了pg,我需要将pg主机设置为docker官方文档中没有提到的那个地址。
        • Docker 将在 web 容器的 /etc/hosts 中设置一个条目,名称为 db 和 db 容器的 IP,因此您无需手动发现 IP 地址 - 您可以只使用名称“db”。
        • 我现在知道了,但我改用 env 变量。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 2017-01-12
        • 1970-01-01
        • 2016-09-12
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多