【问题标题】:Docker Compose doesn't work when I have "volumes", otherwise it works. Why?当我有“卷”时,Docker Compose 不起作用,否则它会起作用。为什么?
【发布时间】: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


【解决方案1】:

问题:

我将卷放在与包含 web_app 的所有源代码的卷相同的目录中。

网友Iain Shelvington发表评论,

web_app 的卷正在覆盖工作目录 /my_project 具有命名卷。

我不知道卷会为自己覆盖整个目录(自私!)。

解决方案:

我将目标更改为容器中的一个空目录。

target: /my_project/my_db_volume

target: /my_project/web_app_volume

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2021-09-25
    • 2021-07-19
    相关资源
    最近更新 更多