java - 使用 TestContainers 和 Jenkins 在 docker 容器中运行测试(docker.sock 权限被拒绝)

标签 java docker jenkins testcontainers

在我的测试中,我使用 TestContainers .我想使用 Jenkins 在容器中运行测试。我使用 maven 创建了此图像用于运行测试.
Dockerfile:

FROM registry.company.com/maven:3-jdk-8-slim

RUN apt update
RUN apt install -y wget libatomic1 curl gnupg

RUN wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/ndbclient_7.6.10-1debian9_amd64.deb \
&& dpkg -i ndbclient_7.6.10-1debian9_amd64.deb && rm ndbclient_7.6.10-1debian9_amd64.deb
RUN ln -s /usr/lib/x86_64-linux-gnu/libndbclient.so.6.1.0 /usr/lib/x86_64-linux-gnu/libndbclient.so

RUN curl -sL https://deb.nodesource.com/setup_10.x  | bash -
RUN apt-get -y install nodejs

RUN groupadd --gid 10000 ldap && useradd -m --uid 10028 --gid 10000 jenkins
RUN echo "jenkins ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers

COPY settings.xml /home/jenkins/

USER jenkins

在我的测试中,我使用 MySQL Cluster容器。

对于 Jenkins我在 Jenkinsfile 中添加节点:
node('Docker') {
    checkout scm

    docker.withRegistry('http://registry.company.com/v2/', 'cred_id') {
        docker.image('integration-tests:latest')
                .inside('-v $HOME/.m2:/home/jenkins/.m2:rw -u jenkins') {
                    stage('Test') {
                        sh 'mvn clean -s /home/jenkins/settings.xml'
                        sh 'mvn -s /home/jenkins/settings.xml test -DargLine="-Djava.library.path=/usr/lib/x86_64-linux-gnu/"'
                    }
                }
    }
}

问题是 Jenkins 是从用户 jenkins 运行的。我使用相同的用户 ID 和组 ID 创建了相同的用户。但是当我开始测试时,我可以访问 docker.sock被拒绝:
Caused by: java.io.IOException: com.sun.jna.LastErrorException: [13] Permission denied
    at org.testcontainers.shaded.org.scalasbt.ipcsocket.UnixDomainSocket.<init>(UnixDomainSocket.java:62)
    at org.testcontainers.dockerclient.transport.okhttp.UnixSocketFactory$1.<init>(UnixSocketFactory.java:27)
    at org.testcontainers.dockerclient.transport.okhttp.UnixSocketFactory.createSocket(UnixSocketFactory.java:27)

我研究了这个页面:https://www.testcontainers.org/supported_docker_environment/continuous_integration/dind_patterns/但这对我没有帮助。一切都从root用户开始,当然他没有问题。

我该如何解决?

最佳答案

一个肮脏的修复是:

sudo chmod a+rw /var/run/docker.sock
这可能有一些安全风险,但我在我的本地机器上。

关于java - 使用 TestContainers 和 Jenkins 在 docker 容器中运行测试(docker.sock 权限被拒绝),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56661815/

相关文章:

java - 修复 Jackson 无法构造 Java.time.LocalDate 实例的问题

java - 复制构造函数与可克隆。为什么我不应该考虑 Cloneable?

docker - 必须指定至少一个容器源

java - 无需使用 Maven 重建即可运行 Jenkins 集成测试

jenkins 作业卡住 加载节点环境变量

github - Jenkins github 拉取请求构建器插件未发布到 github

java - XPath lower-case() 获取小写值的集合

java - MySQL 员工数据库 java.sql.SQLException : url cannot be null

Docker-compose 重新启动仅更新的图像

docker - JupyterHub产生的Jupyter Notebook容器没有外部网络访问权限