使用Docker Jenkins容器时,执行docker命令提示"docker: not found"。

3
"jenkins正在Docker容器中运行。
在Mac OS中使用Docker。因此,我在jenkins.yml文件中注释掉了这些行:"
    # mount docker sock and binary for docker in docker (only works on linux)
    #- /var/run/docker.sock:/var/run/docker.sock
    #- /usr/bin/docker:/usr/bin/docker

由JHipster生成的Jenkinsfile包含两个任务:

  1. 在Docker容器中执行构建
  2. 使用Sonar分析代码

列表项

node {
stage('checkout') {
    checkout scm
}

docker.image('openjdk:8').inside('-u root -e MAVEN_OPTS="-Duser.home=./"') {
    stage('check java') {
        sh "java -version"
    }

从 Bitbucket 进行的检出成功。在 Docker "pull openjdk:8" 处,管道停止并出现错误。控制台输出如下:
[AAAAApp] Running shell script
+ docker inspect -f . openjdk:8
/var/jenkins_home/workspace/GeneticsDB@tmp/durable-21459aca/script.sh: 
2: /var/jenkins_home/workspace/GeneticsDB@tmp/durable-21459aca/script.sh: docker: not found
[Pipeline] sh
[AAAAApp] Running shell script
+ docker pull openjdk:8
/var/jenkins_home/workspace/GeneticsDB@tmp/durable-d5590370/script.sh: 
2: /var/jenkins_home/workspace/GeneticsDB@tmp/durable-d5590370/script.sh: docker: not found

但是这个命令可以在命令行中成功运行,例如下面这样:
docker pull openjdk:8
    8: Pulling from library/openjdk
    Digest: sha256:18c9622a8dc67b608a2dd0178b4c5aebc0e2da9a656072c6e799cfc46cb96422
    Status: Image is up to date for openjdk:8

我知道有一个类似的问题:使用Docker Jenkins容器管道构建Docker映像时找不到Docker

但是我的docker在Mac OS上运行。

另一个问题:尝试连接到unix:///var/run/docker.sock的Docker守护程序套接字时,出现了权限被拒绝的错误。 - Jenny
所以我尝试运行命令 "docker exec -it ec379335d599 ls -l /var/run/docker.sock",得到结果 "rw-rw---- 1 root root 0 Feb 10 19:16 /var/run/docker.sock"。然后我尝试更改权限:"docker exec -it ec379335d599 chmod o+r /var/run/docker.sock",但是出现了错误信息:"chmod: changing permissions of '/var/run/docker.sock': Operation not permitted"。 - Jenny
对于其他遇到此问题的人,您需要重新启动您的Mac并在启动时按下⌘+R。然后进入实用工具>终端并输入以下命令:csrutil disable 重新启动 这是系统完整性保护的结果。 - Jenny
仍然没有成功。 - Jenny
3个回答

2

问题实际上是如何在运行Docker for Mac的容器内运行Docker。这可以通过以下方式解决:

brew install docker

并更新jenkins.yml为

 # mount docker sock and binary for docker in docker
- /var/run/docker.sock:/var/run/docker.sock
- /usr/local/bin/docker:/usr/local/bin/docker

0
如果您的Jenkins运行在Docker容器中,我建议:
  1. 在该容器内安装Docker
  2. 挂载Docker套接字以便从容器内运行Docker命令
  3. 在Jenkins容器的entrypoint.sh中动态调整Jenkins用户的组权限,这样您就不需要更改Docker套接字的权限或尝试将主机组与容器组匹配
我使用一个作为root运行的entrypoint来完成最后一步,它运行一个groupmod来调整用户组的gid,然后使用exec + gosu降低到该用户的权限,用jenkins用户替换pid 1运行Jenkins服务器。所有必要的代码都在以下git repo中:https://github.com/sudo-bmitch/jenkins-docker

0

出现了一个错误:

Warning: failed to get default registry endpoint from daemon (Got 
permission denied while trying to connect to the Docker daemon socket 
at unix:///var/run/docker.sock: Get 
http://%2Fvar%2Frun%2Fdocker.sock/v1.35/info: dial unix 
/var/run/docker.sock: connect: permission denied). Using system 
default: https://index.docker.io/v1/
Got permission denied while trying to connect to the Docker daemon 
socket at unix:///var/run/docker.sock: Post 
http://%2Fvar%2Frun%2Fdocker.sock/v1.35/images/create?
fromImage=openjdk&tag=8: dial unix /var/run/docker.sock: connect: 
permission denied

解决方案:更新Docker容器中/var/run/docker.sock的访问权限。
  1. 查找Jenkins容器:docker container ps -a

  2. 登录容器:docker exec -it -u root ec379335d599 /bin/bash

  3. 更新权限:chmod 777 /var/run/docker.sock


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接