V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
icecreamxuegao
V2EX  ›  程序员

关于 docker-compose 挂载文件的问题

  •  
  •   icecreamxuegao · 2019-12-10 10:26:03 +08:00 · 3412 次点击
    这是一个创建于 1800 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天用 docker-compose 起了 jenkins 的容器,但是再容器里面执行 docker build 命令的时候提示 docker 命令找不到,我就把 docker 和 docker.sock 文件都挂载到了容器里面。在容器用 ls 命令查看的时候一切正常,但是使用 docker 命令的时候提示:
    bash-4.4# docker ps
    bash: /usr/bin/docker: No such file or directory
    百度了好多地方还是没有找到解决方案,所以来问问各位大神。
    docker-compose 的配置文件如下:
    version: "3"

    services:
    jenkins:
    image: jenkins/jenkins:alpine
    restart: always
    user: root
    container_name: jenkins
    volumes:
    - /root/jenkins/j-data:/var/jenkins_home
    - /var/run/docker.sock:/var/run/docker.sock
    - /usr/bin/docker:/usr/bin/docker
    ports:
    - "8080:8080"
    - "50000:50000"
    networks:
    - jenkins_network

    networks:
    jenkins_network:
    15 条回复    2019-12-11 12:12:49 +08:00
    icecreamxuegao
        1
    icecreamxuegao  
    OP
       2019-12-10 10:28:09 +08:00
    其他两个文件挂载正常,我在容器里面用 apk add docker 安装 docker 以后也能正常使用,有点不明白为什么 docker 挂载不上去
    hantsy
        3
    hantsy  
       2019-12-10 10:38:37 +08:00
    Docker 里面再跑 Docker,好像看了一些文章,不怎么推荐使用(有一些莫名的其妙的问题)。

    Docker 里面的运行环境应该另外安装吧。
    hantsy
        4
    hantsy  
       2019-12-10 10:40:29 +08:00
    一般挂载的包括:日志,数据,配置 等需要备份的东西。其他的我好像从来没有通过这种方式去实现 Host,Guest 共享。
    icecreamxuegao
        5
    icecreamxuegao  
    OP
       2019-12-10 10:42:38 +08:00
    @hantsy 没有在 docker 里面跑 docker,我只是想用在 docker 里面用 docker 命令去编译镜像,然后再宿主机里面跑
    sleven
        6
    sleven  
       2019-12-10 10:53:48 +08:00 via iPhone
    你想用 Docker in Docker 模式( DinD )的话不是这么用的,起码不是简单把宿主机的 docker 文件挂载进容器就能用,你可以自己搞个基于 Jenkins 并在里面安装 Docker CE 的镜像。具体可以参考这篇文章: https://medium.com/swlh/quickstart-ci-with-jenkins-and-docker-in-docker-c3f7174ee9ff
    Hopetree
        7
    Hopetree  
       2019-12-10 11:21:01 +08:00   ❤️ 1
    我记得是权限问题,因为 Jenkins 容器的用户是 Jenkins,但是 docker 需要 root 用户以及有权限的用户,反正就是权限问题吧,网上挺多这方面的

    其实我觉得没必要 Jenkins 运行 docker,搞个从节点,从节点有 docker 就行了,我一致都是主从节点搞的,主节点只运行 Jenkins 分配任务,从节点安装各种环境运行任务,从节点可以用容器运行任何,完美解决
    zuihoudezhanyi
        8
    zuihoudezhanyi  
       2019-12-10 14:15:33 +08:00
    /root/jenkins/j-data 目录权限修改为 1000,应该可以了,我之前碰到过
    zuihoudezhanyi
        9
    zuihoudezhanyi  
       2019-12-10 14:17:05 +08:00
    @zuihoudezhanyi 是用户和用户组
    jackleeforce3615
        10
    jackleeforce3615  
       2019-12-10 15:13:20 +08:00   ❤️ 1
    我就是这样玩的,用 docker 的方式运行 jenkins,然后在 jenkins 中 slave 节点也是一些 docker,因此在 jenkins 中必须要能启动 docker 命令,比如 docker run ,docker inspect 等等。

    我是参考这两篇文章:
    https://www.cnblogs.com/leolztang/p/6934694.html
    https://blog.container-solutions.com/running-docker-in-jenkins-in-docker

    如果玩高级一点,docker 方式安装的 jenkins,构建中调用其他服务器(slave)上的 docker,参考:
    https://jacklee.work/%E5%B7%A5%E4%BD%9C/2019-09-27-jenkins%20%E5%A3%B0%E6%98%8E%E5%BC%8Fpipeline%E8%B0%83%E7%94%A8%E8%BF%9C%E7%A8%8BDocker%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1.html

    贴一下我的 docker-compose.yml 和 jenkins 的 dockerfile:

    ![docker-compose]( https://tva1.sinaimg.cn/large/006tNbRwgy1g9rmx1ilvqj30mj0h8wgk.jpg)

    ![dockerfile]( https://tva1.sinaimg.cn/large/006tNbRwgy1g9rmy4arfcj30ld08gt9u.jpg)
    icecreamxuegao
        11
    icecreamxuegao  
    OP
       2019-12-10 17:23:31 +08:00
    好了,问题已经找到了,是因为 alpine 识别不了宿主机可执行文件的格式,换了另外一个镜像就可以了
    icecreamxuegao
        12
    icecreamxuegao  
    OP
       2019-12-10 17:31:31 +08:00
    @jackleeforce3615 thx,我去看看。之前没用过 jenkins
    icecreamxuegao
        13
    icecreamxuegao  
    OP
       2019-12-10 17:32:37 +08:00
    @zuihoudezhanyi 不是权限的问题,是 jenkins 我用了 alpine 版的镜像,宿主机是 centos 的,alpine 识别不了可执行文件
    fatbear
        14
    fatbear  
       2019-12-11 12:04:28 +08:00   ❤️ 1
    @icecreamxuegao 并非是不识别可执行文件,是因为 apline 依赖的底层 C 库是 musl,而你在外面环境编译的 docker 大概率是基于 glibc 的, 库的名称不一致,导致没找到依赖库运行不了,尝试在 apline 镜像里运行 mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 建立 glibc 映射到 musl 的软链接在运行 docker 试试
    fatbear
        15
    fatbear  
       2019-12-11 12:12:49 +08:00   ❤️ 1
    你在里面 apk add docker 可以正常运行自然也很好理解,你在里面安装 docker,在里面编译,自然不会出现不兼容的情况,但是宿主机是 centos,glibc 编译的程序在基于 musl 的 apline 上运行,就会碰到问题。楼主可以用 ldd 查看宿主机的 /usr/bin/docker,再进到容器里用 ldd 查看 apk add docker 之后的 /usr/bin/docker,就很容易明白为什么映射进去的运行不了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3252 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:09 · PVG 20:09 · LAX 04:09 · JFK 07:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.