You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:08:14