【问题标题】:Run host Docker from within Jenkins Docker从 Jenkins Docker 中运行主机 Docker
【发布时间】:2019-11-20 19:19:57
【问题描述】:

是否可以从正在运行的 Jenkins Docker 容器中为 CI/CD 创建和运行 Docker 容器?所以基本上是从正在运行的容器中访问主机服务器上的 Docker。

在我的主机服务器 (Ubuntu 19.04) 上安装了 Docker(Docker 版本 19.03.3)。通过运行以下命令,我创建了一个 Jenkins 容器,我授予 Docker 权限(我想):

mkdir /home/myuser/Desktop/jenkins_home
docker run -dit --name jenkins -v /home/myuser/Desktop/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 jenkins/jenkins:lts

在 Jenkins 中,我创建了一个从 Git 加载 Jenkinsfile 的管道,如下所示:

pipeline {
    agent {
        docker {
            image 'ubuntu:19.04'
            args '-u root:sudo -p 3000:3000'
        }
    }
    stages {
        stage('Install') {
            steps {
                sh 'apt-get update'
                sh 'apt-get install -y curl'
                sh 'curl -sL https://deb.nodesource.com/setup_13.x | sh -'
                sh 'curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -'
                sh 'echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list'
                sh 'apt-get update'
                sh 'apt-get install -y nodejs yarn'
            }
        }
        stage('Build') {
            steps {
                sh './build.sh'
            }
        }
    }
}

当我运行 Pipeline 时,它​​在尝试指示 Docker 拉取 ubuntu:19.04 Docker 映像时崩溃。错误是docker: not found

我的 Jenkins 容器和主机 Docker 访问文件之间的连接配置错误。从 Docker 容器中在主机服务器上运行 Docker 命令需要什么配置?

【问题讨论】:

  • 可能 jenkins 用户无法运行 docker deamon
  • 在docker中看看docker

标签: docker ubuntu jenkins


【解决方案1】:

如果您想从 Jenkins 容器创建和运行用于 CI/CD 的 Docker 容器, 这可以通过在 Jenkins 作业上创建一个在 Docker 主机上运行 ssh 命令的 shell 命令来实现。

这需要 Jenkins 容器 ssh 公钥在 Docker 主机上被授权,因此 authorized_keys 文件应该存在于 Docker 主机上。 要在 Jenkins 容器中使用相同的 ssh 密钥,可以在 Jenkins 容器上使用带有 ssh 密钥的绑定挂载。 使用 docker-compose 的示例:

volumes:
- /home/user/.ssh/id_rsa:/var/jenkins_home/.ssh/id_rsa 
- /home/user/.ssh/id_rsa.pub:/var/jenkins_home/.ssh/id_rsa.pub

这是一个 shell 命令的示例内容,用于从 Jenkins 作业启动和更新 Docker 主机上的容器:

cat ./target/stack/installer-*.tar | ssh root@${DOCKER_HOST} \
        /home/user/Build-Server/remote-installer.sh

在上面的命令中,安装程序在 Docker 主机上启动。结果,新容器在 Docker 主机上部署/更新。 remote-installer.sh 脚本从标准输入接收文件并使用 tar 命令解压。

TEMPDIR=`mktemp -d`
echo "unarchiving to $TEMPDIR"
tar xv -C "$TEMPDIR"
...

这适用于 Docker 容器与 Jenkins 容器位于同一服务器上或 Docker 容器和 Jenkins 容器位于不同服务器上的两种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多