docker build构建镜像正常,docker compose build却超时挂起
使用docker build . --network host可正常完成镜像构建,但执行docker compose build时,无论在docker-compose.yml中是否为目标服务设置network_mode: "host",构建过程执行到RUN apk update ...步骤都会挂起并最终抛出连接超时错误。
相关配置文件
Dockerfile
FROM python:3.10-alpine3.18 COPY . . RUN apk update && apk upgrade \ && apk add git vim busybox \ && pip3 install -r requirements.txt ENTRYPOINT ["busybox"] CMD ["crond", "-f"]
docker-compose.yml
version: "3.7" services: mongodb: container_name: mongo-server image: mongo:6.0 networks: - mynet mongo-express: image: mongo-express:latest networks: - mynet depends_on: - mongodb ports: - "8081:8081" repository: container_name: repository network_mode: "host" build: context: . dockerfile: Dockerfile networks: mynet: external: true
排查方向
区分构建阶段与运行时的网络设置:
network_mode: host是容器运行时的配置,构建阶段不生效。Docker Compose默认使用专属构建网络,需在build配置中显式指定网络对齐单独构建的参数:repository: build: context: . dockerfile: Dockerfile network: host核对代理变量传递逻辑:单独
docker build可能继承终端代理环境变量,但Docker Compose构建时未必自动传递。可在docker-compose.yml的build部分显式传入:repository: build: context: . dockerfile: Dockerfile args: http_proxy: ${http_proxy} https_proxy: ${https_proxy} no_proxy: ${no_proxy}同时在Dockerfile开头添加对应ARG声明:
ARG http_proxy ARG https_proxy ARG no_proxy另外检查Docker daemon全局代理配置(
/etc/docker/daemon.json),确认Compose是否能读取该配置。排查外部网络
mynet的间接影响:尽管构建阶段理论上不依赖运行时网络,但如果mynet存在DNS配置错误、网络隔离等问题,可能间接干扰构建环境。可临时注释该网络配置,改用默认网络测试。查看详细构建日志:执行
docker compose build --no-cache --progress plain repository,获取更精细的输出,确认超时是DNS解析失败还是TCP连接超时。模拟构建环境的网络连通性:手动启动Alpine容器,使用Compose构建时的网络测试连通性:
# 先通过docker network ls找到Compose构建用的网络名称 docker run --rm --network <构建网络名称> alpine:3.18 ping -c 3 mirrors.aliyun.com docker run --rm --network <构建网络名称> alpine:3.18 wget -qO- http://mirrors.aliyun.com/alpine/v3.18/main/检查Docker Compose版本兼容性:不同版本的Compose在构建网络处理上可能存在差异,尝试升级到最新稳定版或降级到兼容版本测试。
内容的提问来源于stack exchange,提问作者AbreQueVoy

