Gitlab CI 上的 TestContainers 集成测试

neo*_*rol 7 java maven gitlab-ci testcontainers

我有一个java项目,它使用testcontainers进行集成测试。我想在该阶段实现 gitlab ci 但我遇到了这个错误

\n
java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration\n
Run Code Online (Sandbox Code Playgroud)\n

项目在本地计算机上成功构建,但 gitlap ci docker 无法正确启动

\n

这里有一个日志输出

\n
\n[0KRunning with gitlab-runner 14.3.0 (b37d3da9)[0;m\n[0K  on Backend Docker runner 9L3Zko1w[0;m\nsection_start:1657698628:prepare_executor\n[0K[0K[36;1mPreparing the "docker" executor[0;m[0;m\n[0KUsing Docker executor with image maven:3.6.0-jdk-11-slim ...[0;m\n[0KStarting service docker:dind ...[0;m\n[0KPulling docker image docker:dind ...[0;m\n[0KUsing docker image sha256:232342342342 for docker:dind with digest docker@sha256:2342342342 ...[0;m\n[0KWaiting for services to be up and running...[0;m\n\n[0;33m*** WARNING:[0;m Service runner-23423423-docker-0 probably didn't start properly.\n\nHealth check error:\nservice "runner-234234234-docker-0-wait-for-service" timeout\n\nHealth check container logs:\n\n\nService container logs:\n2022-07-13T07:50:40.800780292Z ip: can't find device 'ip_tables'\n2022-07-13T07:50:40.801898214Z ip_tables              32768  2 iptable_filter,iptable_nat\n2022-07-13T07:50:40.802546323Z x_tables               45056  5 xt_conntrack,xt_MASQUERADE,xt_addrtype,iptable_filter,ip_tables\n2022-07-13T07:50:40.802609399Z modprobe: can't change directory to '/lib/modules': No such file or directory\n2022-07-13T07:50:40.806461330Z mount: permission denied (are you root?)\n2022-07-13T07:50:40.807019652Z Could not mount /sys/kernel/security.\n2022-07-13T07:50:40.807028026Z AppArmor detection and --privileged mode might break.\n2022-07-13T07:50:40.807931221Z mount: permission denied (are you root?)\n\n
Run Code Online (Sandbox Code Playgroud)\n

这是 gitlab ci yaml

\n
services:\n  - name: docker:dind\n    # explicitly disable tls to avoid docker startup interruption\n    command: ["--tls=false"]\nvariables:\n  # Instruct Testcontainers to use the daemon of DinD.\n  DOCKER_HOST: "tcp://docker:2375"\n  # Instruct Docker not to start over TLS.\n  DOCKER_TLS_CERTDIR: ""\n  # Improve performance with overlayfs.\n  DOCKER_DRIVER: overlay2\ntest:\n  image: maven:3.8.6-jdk-11-slim\n  stage: \xe2\x9a\x99\xef\xb8\x8f maven-build\n  before_script:\n    - docker info\n    - cp $MAVEN_SETTINGS_XML ~/.m2/settings.xml\n  script:\n    - mvn $MAVEN_CLI_OPTS clean verify\n\n\n\n
Run Code Online (Sandbox Code Playgroud)\n

R10*_*t-- 1

仅使用maven:3.8.6-jdk-11-slim图像是不够的。您还需要docker安装在您的映像中。获取 docker 的一个非常简单的方法就是在管道中手动安装它:

before_script:
    - curl -fsSL https://get.docker.com -o get-docker.sh
    - bash ./get-docker.sh
    - docker info
Run Code Online (Sandbox Code Playgroud)

但是,如果您在自定义 docker 映像中安装 docker 会更好,这样您就不必在每次管道运行时都不断地安装 docker。您可以使用这个 dockerfile 来做到这一点:

FROM maven:3.8.6-jdk-11-slim
RUN curl -fsSL https://get.docker.com -o get-docker.sh
RUN bash ./get-docker.sh
Run Code Online (Sandbox Code Playgroud)

然后可以将生成的映像上传到注册表并使用,而maven:3.8.6-jdk-11-slim无需每次都安装 docker。

  • 使用 Testcontainers 时不需要安装 Docker,附加“dind”服务通常就足够了。 (2认同)