• 在docker for windows运行jenkins时,docker不可用的问题


    docker镜像用的jenkinsci/blueocean,用原始的jenkins下的也可以。

    注意:最终方发有修改,写在了最后!

    问题1

    在运行docker命令时,如docker version,会提示cannot connect to docker daemon的错误。

    原因

    jenkins使用的是宿主机的docker环境,本身不运行docker daemon。

    解决方式

    所以需要挂在宿主机的docker.sock文件。即在启动时增加挂载:

    "/var/run/docker.sock:/var/run/docker.sock"
    

    虽然windows下在宿主机上看不到/var/run/docker.sock文件,但实际上docker for windows是会跑一个Hyper-V虚拟的Linux环境并运行docker daemon的,在启动docker镜像时,docker container可以挂载到虚拟机的docker socket文件。
    这个方法来自这篇文章:连接

    新的问题

    这样挂载以后,重新exec到宿主机上执行docker version,不再提示上一个错误了,但是会提示权限不够。

    查看/var/run/docker.sock文件,会发现所有者和组都是root,其他用户不允许独写。

    而blueocean镜像,jenkins是以jenkins用户运行的,所以无法访问。

    解决方式

    以root身份登入

    docker exec -it -u root [container-id] sh
    

    修改socket文件权限,这里修改所有组给jenkins

    chgrp jenkins /var/run/docker.sock
    

    然后就可以了。

    其他

    这里在权限问题时,想切换root用户那里卡了很久。原因是一开始一直在用docker exe而不是docker exec。。。而docker给我的提示是不认识-u选项,而不是不认识exe命令。。。

    后记

    在看jenkins文档是,偶然发现有dind`这个组件,可以支持在docker中运行docker,也就是在jenkins的docker中跑docker。

    不过又看到了dind作者的这篇文章,如果只是为了CI使用的话,作者其实也是推荐通过bind mount docker的socket文件来实现docker中跑docker命令的。因为dind是为了docker开发使用的。

    补充-0602

    由于blueocean镜像的一些问题,最终还是切换回原始镜像打包了,原始镜像的Dockerfile和docker-compose配置如下:

    # Dockerfile
    FROM jenkins/jenkins:lts
    
    # 直接用root,避免很多问题
    USER root
    
    # 原始镜像没有docker,这里重新下载
    RUN rm -f /etc/localtime 
    	&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
    	&& apt-get update 
    	&& curl -sSL https://get.docker.com/ | sh
    
    # 原始镜像没有maven,我这里挂的外部下载好的
    ENV MAVEN_HOME=/var/maven
    ENV PATH $PATH:$MAVEN_HOME/bin
    
    # docker-compose
        jenkins:
            # my-jenkins是我打包的jenkins镜像
            image: my-jenkins
            volumes:
                - "d:/docker/jenkins:/var/jenkins_home"
                - "/var/run/docker.sock:/var/run/docker.sock"
                - "d:/docker/jenkins_maven:/var/maven"
            ports:
                - "8080:8080"
                - "50000:50000"
            environment:
                - "TZ=Asia/Shanghai"
            deploy:
                replicas: 1
                restart_policy:
                    condition: on-failure
            networks:
                - jenkins
            restart: always
    
  • 相关阅读:
    全球化编码
    linuxGrep命令
    Xcode-插件所在路径
    多控制器间数据传递
    触摸事件
    IOS事件处理
    事件监听的三种方法
    UITabBarController
    聊天布局
    Info.plist:项目配置文件
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/13023696.html
Copyright © 2020-2023  润新知