我在CentOS机器上运行Jenkins和Docker。我有一个Jenkins工作,可以获取Github仓库并构建Docker镜像。当我尝试运行该作业时,我收到错误:
+ docker build -t myProject .
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
Build step 'Execute shell' marked build as failure
Finished: FAILURE
即使我已经通过sudo usermod -aG docker jenkins
将jenkins添加到我的docker用户组并重新启动了我的计算机,也会发生这种情况。我该如何解决这个问题?
顺便说一下,如果尝试将命令更改为sudo docker build -t myProject .
,我只会收到错误sudo: sorry, you must have a tty to run sudo
答案 0 :(得分:32)
安装Jenkins和Docker之后。 将jenkins用户添加到dockergroup(就像你一样)
sudo gpasswd -a jenkins docker
编辑以下文件
vi /usr/lib/systemd/system/docker.service
编辑此规则以公开API:
ExecStart=/usr/bin/docker daemon -H unix:// -H tcp://localhost:2375
现在是时候重新加载并重新启动Docker守护程序了
systemctl daemon-reload
systemctl restart docker
然后我重新启动了jenkins,我能够在我的jenkins工作中以jenkins用户身份执行docker命令
sudo service jenkins restart
答案 1 :(得分:3)
@lvthillo,你的回答很好,但还不够。您还需要创建docker组。请参阅 Docker的安装后步骤 以非root用户身份管理Docker https://docs.docker.com/engine/installation/linux/linux-postinstall/#manage-docker-as-a-non-root-user
将运行jenkins的用户添加到docker组。
E.g。如果您在jenkins
用户下运行Jenkins服务器:
第1步:创建Docker组
sudo groupadd docker
第2步:将您的用户添加到docker
群组:
sudo usermod -aG docker jenkins
步骤3:注销并以jenkins身份重新登录,然后测试:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
为此目的,docker
组在启动时由docker守护程序进行特殊处理。该组中的任何用户现在都可以在没有sudo的情况下调用docker。小心使用。
https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
答案 2 :(得分:3)
我和詹金斯有同样的问题。
我通过在docker-compose.yml上添加 /var/run/docker.sock:/var/run/docker.sock 来解决此问题:
jenkins:
container_name: jenkins
build: "jenkins/"
ports:
- "8080:8080"
environment:
- JAVA_OPTS:-Djava.awt.headless=true
volumes:
- /var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
答案 3 :(得分:2)
另一种选择是将您的Jenkins泊坞主机指向'unix:///var/run/docker.sock'
这不是运行实际的docker主机并打开它。
答案 4 :(得分:1)
您不能使用invalid argument "myProject" for "-t, --tag" flag: invalid reference format: repository name must be lowercase
See 'docker build --help'.
作为标签名称。
图片名称和标签必须全部小写。
Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
如果您使用的是docker-compose,则会看到一个误导性错误
output_sentence = []
for key in row['o'].lower():
if key not in dictionary.keys():
dictionary[key] = len(dictionary)
output_sentence.append(dictionary[key])
final_output_sentence = np.array(output_sentence).reshape(1,-1,1)
答案 5 :(得分:0)
对我来说,解决方法是...
重新加载并重新启动Docker守护程序
systemctl daemon-reload
systemctl restart docker
但随后转到
通过管理Jenkins->管理节点->断开代理,断开Docker Jenkins代理的连接。
然后重新连接代理,该代理会将用户保留在docker组中。
答案 6 :(得分:0)
我使用的是 jenkins-blueocean
我的问题是我想使用 docker.sock 并使用与托管系统相同的守护程序,而不是从容器设置的 docker 守护程序进行部署
为此,请确保将 DOCKER_HOST 环境正确设置为您在卷中指定的 docker.socket
--env DOCKER_HOST=unix:///var/run/docker.sock \
并通过指定其 docker.sock 将 docker 守护进程指定为与托管容器的守护进程相同的守护进程
--volume /var/run/docker.sock:/var/run/docker.sock \
请确保您没有指定任何 TLS 参数,否则它可能会尝试使用 HTTPS 进行通信。
删除这样的东西:
--env DOCKER_TLS_VERIFY=1 \
Docker 文件:
FROM jenkins/jenkins:2.263.4-lts-jdk11
USER root
RUN apt-get update && apt-get install -y apt-transport-https \
ca-certificates curl gnupg2 \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable"
RUN apt-get update && apt-get install -y docker-ce-cli
USER jenkins
RUN jenkins-plugin-cli --plugins blueocean:1.24.4
运行命令:
docker run \
--name jenkins-blueocean \
--rm \
--detach \
--network jenkins \
--env DOCKER_HOST=unix:///var/run/docker.sock \
--env DOCKER_CERT_PATH=/certs/client \
--publish 8080:8080 \
--publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
--volume /var/run/docker.sock:/var/run/docker.sock \
myjenkins-blueocean:1.1