AWX Docker Compose部署PostgreSQL DNS解析失败问题求助
AWX容器重建后无法连接Web界面,DNS配置导致数据库解析失败
问题背景
通过Docker Compose部署AWX,修改docker-compose.yml强制awx_web容器向/etc/resolv.conf写入特定DNS IP后,执行命令:
docker pull; docker compose up -d
容器重建后无法访问AWX Web界面,尝试过停止重启容器、重载nginx并确认运行状态、调整docker-compose.yml重建容器、通过awx/installer/install.yml重新部署,均无法解决,始终显示服务器错误。
错误日志
awx_web日志
执行awx logs awx_web得到以下内容:
self.connect() File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/base/base.py", line 195, in connect self.connection = self.get_new_connection(conn_params) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/postgresql/base.py", line 178, in get_new_connection connection = Database.connect(**conn_params) File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/psycopg2/__init__.py", line 126, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known RESULT 2 OKREADY 2023-03-15 02:16:01,844 INFO exited: wsbroadcast (exit status 1; not expected) 2023-03-15 02:16:01,844 INFO exited: wsbroadcast (exit status 1; not expected) 2023-03-15 02:16:02,848 INFO spawned: 'wsbroadcast' with pid 7561 2023-03-15 02:16:02,848 INFO spawned: 'wsbroadcast' with pid 7561 2023-03-15 02:16:03,850 INFO success: wsbroadcast entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 2023-03-15 02:16:03,850 INFO success: wsbroadcast entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
PostgreSQL日志
PostgreSQL Database directory appears to contain a database; Skipping initialization 2023-03-15 02:14:16.396 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 2023-03-15 02:14:16.396 UTC [1] LOG: listening on IPv6 address "::", port 5432 2023-03-15 02:14:16.404 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 2023-03-15 02:14:16.432 UTC [26] LOG: database system was shut down at 2023-03-15 02:13:50 UTC 2023-03-15 02:14:16.440 UTC [1] LOG: database system is ready to accept connections
Docker网络信息
执行docker network ls得到:
NETWORK ID NAME DRIVER SCOPE 5c661c37460f awxcompose_default bridge local 6e91f0243cfd bridge bridge local 0f6ab0c7ce0f host host local 5c7e12dba410 none null local
界面报错
访问AWX主页显示服务器错误(页面提示"There was a problem with your request")
当前docker-compose.yml配置
services: web: image: ansible/awx:15.0.0 container_name: awx_web depends_on: - redis - postgres ports: - "80:8052" - "443:443" hostname: awxweb user: root restart: unless-stopped volumes: - supervisor-socket:/var/run/supervisor - rsyslog-socket:/var/run/awx-rsyslog/ - rsyslog-config:/var/lib/awx/rsyslog/ - "~/.awx/awxcompose/SECRET_KEY:/etc/tower/SECRET_KEY" - "~/.awx/awxcompose/environment.sh:/etc/tower/conf.d/environment.sh" - "~/.awx/awxcompose/credentials.py:/etc/tower/conf.d/credentials.py" - "~/.awx/awxcompose/nginx.conf:/etc/nginx/nginx.conf:ro" - "~/.awx/awxcompose/redis_socket:/var/run/redis/:rw" - "/var/lib/awx/projects:/var/lib/awx/projects:rw" - "./resolv.conf:/etc/resolv.conf" dns: - 127.0.0.11 environment: http_proxy: https_proxy: no_proxy: task: image: ansible/awx:15.0.0 container_name: awx_task depends_on: - redis - web - postgres command: /usr/bin/launch_awx_task.sh hostname: awx user: root restart: unless-stopped volumes: - supervisor-socket:/var/run/supervisor - rsyslog-socket:/var/run/awx-rsyslog/ - rsyslog-config:/var/lib/awx/rsyslog/ - "~/.awx/awxcompose/SECRET_KEY:/etc/tower/SECRET_KEY" - "~/.awx/awxcompose/environment.sh:/etc/tower/conf.d/environment.sh" - "~/.awx/awxcompose/credentials.py:/etc/tower/conf.d/credentials.py" - "~/.awx/awxcompose/redis_socket:/var/run/redis/:rw" - "/var/lib/awx/projects:/var/lib/awx/projects:rw" dns: #- 10.1.2.3 #- 10.2.3.4 - 127.0.0.11 environment: http_proxy: https_proxy: no_proxy: SUPERVISOR_WEB_CONFIG_PATH: '/etc/supervisord.conf' redis: image: redis container_name: awx_redis restart: unless-stopped environment: http_proxy: https_proxy: no_proxy: command: ["/usr/local/etc/redis/redis.conf"] volumes: - "~/.awx/awxcompose/redis.conf:/usr/local/etc/redis/redis.conf:ro" - "~/.awx/awxcompose/redis_socket:/var/run/redis/:rw" postgres: image: postgres:10 container_name: awx_postgres restart: unless-stopped volumes: - "~/.awx/pgdocker/10/data/:/var/lib/postgresql/data:Z" environment: POSTGRES_USER: awx POSTGRES_PASSWORD: awxpass POSTGRES_DB: awx http_proxy: https_proxy: no_proxy: volumes: supervisor-socket: rsyslog-socket: rsyslog-config:
解决方案
核心问题原因
挂载自定义resolv.conf覆盖了容器默认配置,导致Docker内置DNS解析器(127.0.0.11)无法正常工作,进而无法解析Docker Compose自动创建的服务名称(如postgres)。
修复步骤
- 移除自定义resolv.conf挂载:在
awx_web服务的volumes中删除- "./resolv.conf:/etc/resolv.conf"这一行。 - 正确配置DNS:如果需要指定外部DNS,直接通过
dns字段配置,无需挂载resolv.conf。例如:
注意必须保留dns: - 127.0.0.11 - 你的外部DNS地址127.0.0.11,这是Docker内置的DNS解析器,负责解析容器服务名称。 - 重建容器:执行命令:
docker compose down docker compose up -d - 验证解析:进入
awx_web容器测试postgres解析:
若能正常ping通,说明解析恢复。docker exec -it awx_web ping postgres
补充说明
- Docker Compose默认会为每个服务创建一个自定义网络(这里是
awxcompose_default),服务名称可以直接通过内置DNS解析。 - 挂载
/etc/resolv.conf会破坏容器的DNS配置,除非你的自定义resolv.conf中包含nameserver 127.0.0.11,否则无法解析服务名称。
内容的提问来源于stack exchange,提问作者ficestat
相关产品推荐
相关产品推荐

