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

Docker Compose启动时Testcontainers环境异常求助

问题解决:Docker Compose启动时Testcontainers报无法找到Docker环境

核心原因分析

  1. 容器内缺少Docker客户端:Testcontainers需要通过docker命令与宿主机的Docker守护进程通信,默认Java镜像未包含该客户端。
  2. 权限不足:容器内运行用户没有访问挂载的/var/run/docker.sock的权限。
  3. 冗余服务冲突:你在docker-compose.yml中定义的testcontainer服务完全多余,Testcontainers会自动管理测试用容器,该服务可能引发端口或资源冲突。
  4. 环境变量未明确配置:Testcontainers需要明确的Docker主机地址配置,否则可能无法识别挂载的套接字。

分步解决方案

1. 修改Dockerfile,添加Docker客户端

在构建应用镜像时,安装Docker命令行工具,确保容器内可以调用Docker:

FROM openjdk:17-jdk-slim

# 更新软件源并安装Docker客户端
RUN apt-get update && apt-get install -y --no-install-recommends docker.io \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/app
COPY target/TestTask-0.0.1-SNAPSHOT.jar .

2. 优化Docker Compose配置

移除冗余服务,补充权限和环境变量配置:

services:
  app:
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:54320/TestTask_DB
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root
      # 明确指定Docker套接字地址
      DOCKER_HOST: unix:///var/run/docker.sock
    restart: on-failure
    # 使用root用户确保有权限访问docker.sock(测试环境可安全使用)
    user: root
    command: bash -c "sleep 15 && java -jar /usr/app/TestTask-0.0.1-SNAPSHOT.jar"

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
      POSTGRES_DB: TestTask_DB
    ports:
      - "54320:5432"

3. 调整Testcontainers代码(可选优化)

确保容器启动逻辑正确,添加显式启动代码:

import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
@SpringJUnitConfig(initializers = YourTestClass.Initializer.class)
public class YourTestClass {

    @Container
    public static final PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:13")
            .withDatabaseName("TestTask_DB")
            .withUsername("root")
            .withPassword("root");

    static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
            TestPropertyValues.of(
                    "spring.datasource.url=" + postgresContainer.getJdbcUrl(),
                    "spring.datasource.username=" + postgresContainer.getUsername(),
                    "spring.datasource.password=" + postgresContainer.getPassword()
            ).applyTo(configurableApplicationContext.getEnvironment());
        }
    }
}

关键说明

  • IDE和mvn test能正常运行,是因为测试直接在宿主机环境执行,可直接访问本地Docker守护进程;而Docker Compose启动的应用在容器内,需要通过挂载的docker.sock间接访问宿主机Docker,必须满足客户端、权限、配置三个条件。
  • 移除testcontainer服务是因为Testcontainers会自动创建并销毁测试用PostgreSQL容器,手动定义的服务会占用端口且与Testcontainers的容器冲突。

内容的提问来源于stack exchange,提问作者Sasailo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:21:03