Docker仍启动已删除的Worker服务及数据库连接异常问题排查求助
Docker仍启动已删除的Worker服务及数据库连接异常问题排查求助
大家好,我现在遇到了一个很棘手的问题——我想通过Docker运行我的应用,但明明已经做了很多清理操作,worker_1服务还是会自动启动,并且一个劲地尝试连接localhost的Redis,同时后端服务还连不上PostgreSQL数据库,报错连接被拒绝。下面是我目前的配置和遇到的错误,麻烦大家帮我看看问题出在哪了?
我的环境配置
1. .env文件
我已经注释掉了本地Redis的配置,原本保留了指向Docker容器Redis的配置(不过后来也把Redis相关的配置在settings里全部注释了):
DATABASE_URL=postgres://db_user:db_password@db/db_name #DATABASE_URL=postgres://postgres:123@127.0.0.1/olx-killer # Redis #REDIS_URL=redis://localhost:6379 REDIS_URL=redis://redis:6379
2. settings.py配置
我把所有Redis和Celery相关的配置都彻底注释掉了,确保应用不会加载这些服务:
# Redis #REDIS_URL = os.getenv('REDIS_URL', 'redis://redis:6379/') #REDIS_CACHE_URL = f'{REDIS_URL}/1' # Celery #CELERY_TIMEZONE = TIME_ZONE #CELERY_TASK_TRACK_STARTED = True #CELERY_BROKER_URL = REDIS_URL #CELERY_RESULT_BACKEND = None #CELERY_TASK_SERIALIZER = 'json' #CELERY_RESULT_SERIALIZER = 'json' #CELERY_ACCEPT_CONTENT = ['json']
3. docker-compose.yml配置
我已经从compose文件里完全移除了worker服务的定义,现在只有backend和db两个核心服务:
volumes: pg_data: driver: local x-base: &base-backend build: . volumes: - .:/code:delegated depends_on: - db services: backend: <<: *base-backend ports: - "8000:8000" env_file: .env environment: - DJANGO_SETTINGS_MODULE=settings.main entrypoint: ["/code/entrypoint.sh"] depends_on: - db restart: unless-stopped db: image: postgres:13 volumes: - "pg_data:/var/lib/postgresql/data" environment: POSTGRES_DB: db_name POSTGRES_USER: db_user POSTGRES_PASSWORD: db_password ports: - "5432:5432" restart: unless-stopped
运行时的错误日志
启动Docker后,我发现worker_1居然还是会被启动,并且持续尝试连接localhost的Redis;同时后端服务报错无法连接127.0.0.1的PostgreSQL:
db_1 | 2025-02-06 17:22:20.576 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 db_1 | 2025-02-06 17:22:20.577 UTC [1] LOG: listening on IPv6 address "::", port 5432 db_1 | 2025-02-06 17:22:20.581 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" db_1 | 2025-02-06 17:22:20.588 UTC [63] LOG: database system was shut down at 2025-02-06 17:22:20 UTC db_1 | 2025-02-06 17:22:20.596 UTC [1] LOG: database system is ready to accept connections worker_1 | /usr/local/lib/python3.12/site-packages/celery/platforms.py:829: SecurityWarning: You're running the worker with superuser privileges: this is worker_1 | absolutely not recommended! worker_1 | worker_1 | Please specify a different user using the --uid option. worker_1 | worker_1 | User information: uid=0 euid=0 gid=0 egid=0 worker_1 | worker_1 | warnings.warn(SecurityWarning(ROOT_DISCOURAGED.format( worker_1 | worker_1 | -------------- celery@7625f54ed8c5 v5.4.0 (opalescent) worker_1 | --- ***** ----- worker_1 | -- ******* ---- Linux-5.15.153.1-microsoft-standard-WSL2-x86_64-with-glibc2.36 2025-02-06 19:22:26 worker_1 | - *** --- * --- worker_1 | - ** ---------- [config] worker_1 | - ** ---------- .> app: OLX Clone:0x7f7e62f015b0 worker_1 | - ** ---------- .> transport: redis://localhost:6379// worker_1 | - ** ---------- .> results: disabled:// worker_1 | - *** --- * --- .> concurrency: 12 (prefork) worker_1 | -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) worker_1 | --- ***** ----- worker_1 | -------------- [queues] worker_1 | .> celery exchange=celery(direct) key=celery worker_1 | worker_1 | worker_1 | [tasks] worker_1 | . delete_product_file worker_1 | worker_1 | [2025-02-06 19:22:28,120: WARNING/MainProcess] /usr/local/lib/python3.12/site-packages/celery/worker/consumer/consumer.py:508: CPendingDeprecationWarning: The broker_connection_retry configuration setting will no longer determine worker_1 | whether broker connection retries are made during startup in Celery 6.0 and above. worker_1 | If you wish to retain the existing behavior for retrying connections on startup, worker_1 | you should set broker_connection_retry_on_startup to True. worker_1 | warnings.warn( worker_1 | worker_1 | [2025-02-06 19:22:28,124: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 99 connecting to localhost:6379. Cannot assign requested address.. worker_1 | Trying again in 2.00 seconds... (1/100) worker_1 | worker_1 | [2025-02-06 19:22:30,197: ERROR/MainProcess] consumer: Cannot connect to redis://localhost:6379//: Error 99 connecting to localhost:6379. Cannot assign requested address.. worker_1 | Trying again in 4.00 seconds... (2/100) worker_1 | backend_1 | Traceback (most recent call last): backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/base.py", line 279, in ensure_connection backend_1 | self.connect() backend_1 | File "/usr/local/lib/python3.12/site-packages/django/utils/asyncio.py", line 26, in inner backend_1 | return func(*args, **kwargs) backend_1 | ^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/base.py", line 256, in connect backend_1 | self.connection = self.get_new_connection(conn_params) backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/utils/asyncio.py", line 26, in inner backend_1 | return func(*args, **kwargs) backend_1 | ^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/backends/postgresql/base.py", line 350, in get_new_connection backend_1 | connection = self.Database.connect(**conn_params) backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/psycopg2/__init__.py", line 122, in connect backend_1 | conn = _connect(dsn, connection_factory=connection_factory, **kwasync) backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | psycopg2.OperationalError: connection to server at "127.0.0.1", port 5432 failed: Connection refused backend_1 | Is the server running on that host and accepting TCP/IP connections? backend_1 | backend_1 | backend_1 | The above exception was the direct cause of the following exception: backend_1 | backend_1 | Traceback (most recent call last): backend_1 | File "/code/manage.py", line 23, in <module> backend_1 | main() backend_1 | File "/code/manage.py", line 19, in main backend_1 | execute_from_command_line(sys.argv) backend_1 | File "/usr/local/lib/python3.12/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line backend_1 | utility.execute() backend_1 | File "/usr/local/lib/python3.12/site-packages/django/core/management/__init__.py", line 436, in execute backend_1 | self.fetch_command(subcommand).run_from_argv(self.argv) backend_1 | File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 413, in run_from_argv backend_1 | self.execute(*args, **cmd_options) backend_1 | File "/usr/local/lib/python3.12/site-packages/django/core/management/base.py", line 459, in execute backend_1 | output = self.handle(*args, **options) backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/core/management/commands/showmigrations.py", line 67, in handle backend_1 | return self.show_list(connection, options["app_label"]) backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/core/management/commands/showmigrations.py", line 86, in show_list backend_1 | loader = MigrationLoader(connection, ignore_no_migrations=True) backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/migrations/loader.py", line 58, in __init__ backend_1 | self.build_graph() backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/migrations/loader.py", line 235, in build_graph backend_1 | self.applied_migrations = recorder.applied_migrations() backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/migrations/recorder.py", line 89, in applied_migrations backend_1 | if self.has_table(): backend_1 | ^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/migrations/recorder.py", line 63, in has_table backend_1 | with self.connection.cursor() as cursor: backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/utils/asyncio.py", line 26, in inner backend_1 | return func(*args, **kwargs) backend_1 | ^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/base.py", line 320, in cursor backend_1 | return self._cursor() backend_1 | ^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/base.py", line 296, in _cursor backend_1 | self.ensure_connection() backend_1 | File "/usr/local/lib/python3.12/site-packages/django/utils/asyncio.py", line 26, in inner backend_1 | return func(*args, **kwargs) backend_1 | ^^^^^^^^^^^^^^^^^^^^^ backend_1 | File "/usr/local/lib/python3.12/site-packages/django/db/backends/base/base.py", line 278, in ensure_connection backend_1 | with self.connection.cursor() as cursor: backend_1 | ^^^^^^^^^^^^^^^^^^^^^^^^ backend_1 | psycopg2.OperationalError: connection to server at "127.0.0.1", port 5432 failed: Connection refused backend_1 | Is the server running on that host and accepting TCP/IP connections?
我目前的疑问
- 明明已经在docker-compose.yml里完全移除了worker服务的定义,为什么
worker_1还会被启动?难道是有残留的Docker容器或者缓存没清理干净? - 后端服务为什么会尝试连接
127.0.0.1的PostgreSQL?我的.env里明明配置的是postgres://db_user:db_password@db/db_name,应该指向Docker网络里的db服务才对。
麻烦各位帮我分析一下问题根源,或者给我一些排查的方向,谢谢大家!
备注:内容来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

