修改docker-compose.yaml执行up -d出现“地址已被占用”错误求助
问题描述
运行环境:Ubuntu 20.04.6 LTS
我开发了一个小型守护进程,用于将特定USB设备及其对应软件部署到独立容器中。该进程会监控USB设备状态,据此修改docker-compose.yaml文件以添加或移除对应服务。
原本以为Docker Compose不会改动配置文件中未变更的服务,这套逻辑正常运行了数月,但现在添加新USB设备时,现有容器出现启动错误。
错误信息
sudo docker-compose up -d Starting lauterbach_containerize_t32tcpusb_3-6_1 ... Starting lauterbach_containerize_t32tcpusb_3-6_1 ... error WARNING: Host is already in use by another container ERROR: for lauterbach_containerize_t32tcpusb_3-6_1 Cannot start service t32tcpusb_3-6: driver failed programming external connectivity on endpoint lauterbach_containerize_t32tcpusb_3-6_1 (ad9ebc7e4999b45f5dd6590027db9d7dad3649e4eae66a21bf9887a2beb2fa0f): failed to bind port 0.0.0.0:8457/tcp: Error starting userland proxy: listen tcp4 0.0.0.0:8457: bind: address already in use Creating lauterbach_containerize_t32tcpusb_3-3_1 ... done ERROR: for t32tcpusb_3-6 Cannot start service t32tcpusb_3-6: driver failed programming external connectivity on endpoint lauterbach_containerize_t32tcpusb_3-6_1 (ad9ebc7e4999b45f5dd6590027db9d7dad3649e4eae66a21bf9887a2beb2fa0f): failed to bind port 0.0.0.0:8457/tcp: Error starting userland proxy: listen tcp4 0.0.0.0:8457: bind: address already in use ERROR: Encountered errors while bringing up the project.
该问题并非初始存在,怀疑是软件更新导致。实际占用8457端口的是对应容器的docker-proxy进程,且报错后该进程仍在运行。
修改前的docker-compose.yaml
version: '3' services: t32tcpusb_3-6: image: ubuntu command: /home/fileuser/t32/bin/pc_linux64/t32tcpusb privileged: true volumes: - "/home/fileuser/t32:/home/fileuser/t32" - "/dev/lauterbach/trace32/3-6:/dev/lauterbach/trace32/3-6" devices: - "/dev/lauterbach/trace32/3-6" ports: - "8457:8455"
修改后的docker-compose.yaml
version: '3' services: t32tcpusb_3-3: image: ubuntu command: /home/fileuser/t32/bin/pc_linux64/t32tcpusb privileged: true volumes: - "/home/fileuser/t32:/home/fileuser/t32" - "/dev/lauterbach/trace32/3-3:/dev/lauterbach/trace32/3-3" devices: - "/dev/lauterbach/trace32/3-3" ports: - "8456:8455" t32tcpusb_3-6: image: ubuntu command: /home/fileuser/t32/bin/pc_linux64/t32tcpusb privileged: true volumes: - "/home/fileuser/t32:/home/fileuser/t32" - "/dev/lauterbach/trace32/3-6:/dev/lauterbach/trace32/3-6" devices: - "/dev/lauterbach/trace32/3-6" ports: - "8457:8455"
解决建议
- 避免重建现有容器:执行
docker-compose up -d --no-recreate,该参数会让Compose仅创建新增服务,不会重新启动或重建已存在的容器,从根源避免端口绑定冲突。 - 清理残留代理进程:先定位占用端口的
docker-proxy进程并杀死:
之后再重新执行# 查找进程ID sudo lsof -i :8457 | grep docker-proxy | awk '{print $2}' # 强制终止进程 sudo kill -9 <进程ID>docker-compose up -d。 - 调整守护进程执行逻辑:修改compose文件后,优先执行
docker-compose up -d --no-recreate,若新增服务启动异常,再单独处理新增服务,不影响现有容器。 - 排查版本更新问题:检查Docker和Docker Compose的版本变化,回退到之前稳定运行的版本测试,确认是否为新版本的代理逻辑bug导致问题:
# 查看当前版本 docker --version docker-compose --version
内容的提问来源于stack exchange,提问作者Nippey
相关产品推荐
相关产品推荐

