uni-3 log

    Search by

    docker上のjenkinsでdockerを実行

    docker内のjenkinsでdockerコマンドを実行するための設定方法を書いておく

    環境

    • macOS: 10.13.4

    構成ファイル

    docker-compose.yml
    version: '3'
    services:
      jenkins:
        build:
          context: ./
          dockerfile: Dockerfile-jenkins
        volumes:
          # using docker in jenkins
          - /var/run/docker.sock:/var/run/docker.sock 
    
        ports:
          - "8080:8080"
          - "50000:50000"
    Dockerfile-jenkins
    FROM jenkins/jenkins:lts-alpine
    
    USER root
    
    ENV JENKINS_REF /usr/share/jenkins/ref
    
    # install jenkins plugins
    COPY ./plugins.txt $JENKINS_REF/
    RUN /usr/local/bin/install-plugins.sh < $JENKINS_REF/plugins.txt
    
    RUN apk add --no-cache --virtual make && \
        apk add --no-cache ca-certificates wget && \
        update-ca-certificates && \
        apk add --no-cache openssl
    
    # install docker, docker-compose
    ENV DOCKER_VERSION 17.10.0-ce-rc2
    RUN curl -fL -o docker.tgz "https://download.docker.com/linux/static/test/x86_64/docker-$DOCKER_VERSION.tgz" && \
        tar --strip-components=1 -xvzf docker.tgz -C /usr/bin
    
    RUN curl -o /usr/local/bin/docker-compose -L https://github.com/docker/compose/releases/download/1.19.1/docker-compose-`uname -s`-`uname -m` && chmod +x /usr/local/bin/docker-compose
    
    # add docker group
    RUN addgroup -S docker && adduser jenkins docker
    
    VOLUME /var/jenkins

    ポイントは以下

    • volumesにてローカル(ホストマシン)のdockerソケットをマウントしている
      これによりdockerエンジンをjenkinsコンテナ内で使うことができる。ただしローカルのdockerを操作していることになるのを注意しておく
    • コンテナ内でコマンドを実行できるようにDockerfileでdocker, docker-composeのインストールをしている
    • jenkinsユーザがdockerコマンドを実行できるようにDockerfile内でグループに追加している

    jenkinsのビルド

    docker-compose up -d --build
    ...
    
    docker-compose ps
        Name           Command       State       Ports     
    -------------------------------------------------------
    jenkins_1       /sbin/tini --    Up      0.0.0.0:50000-
                    /usr/local/b             >50000/tcp, 0.
                    ...                      0.0.0:8080->80
                                             80/tcp   

    pipelineの作成と実行

    実際にjenkinsのpipelineでdockerコマンドを実行してみる

    http://localhost:8080よりNew Itemから、Enter an item nameフォームに名前を入力、Pipelineを選択、OKをクリック

    create pipeline

    PipelineScriptに実行スクリプトを入力、Saveをクリック

    実行スクリプト
    #!groovy
    node {
        stage('step') {
            sh 'docker run hello-world'
            sh 'docker ps'
            sh 'pwd'
        }
    }

    create pipeline

    作成したpipelineをクリックし、Build Nowで実行する 実行が終わったら、Console Outputをクリックしてログを見てみる

    create pipeline

    結果

    docker rundocker psが実行される dockerエンジンはローカルのものを使用しているので、ローカルで実行中のコンテナが表示される

    ConsoleOutput
    Started by user unknown or anonymous
    Running in Durability level: MAX_SURVIVABILITY
    [Pipeline] node
    Running on Jenkins in /var/jenkins_home/workspace/test
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (step)
    [Pipeline] sh
    [test] Running shell script
    + docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    9bb5a5d4561a: Already exists
    Digest: sha256:3e1764d0f546ceac4565547df2ac4907fe46f007ea229fd7ef2718514bcec35d
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/engine/userguide/
    
    [Pipeline] sh
    [test] Running shell script
    + docker ps
    CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                              NAMES
    19e965df6a1e        jenkins                      "/sbin/tini -- /us..."   26 minutes ago      Up 26 minutes       0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   jenkins_1
    
    [Pipeline] sh
    [test] Running shell script
    + pwd
    /var/jenkins_home/workspace/test
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    Finished: SUCCESS

    参考

    2021, Built with Gatsby. This site uses Google Analytics.