在我的 OS X 主机上,我使用启用了 Kubernetes 并使用 Kubernetes 编排的 Docker CE (18.06.1-ce-mac73 (26764))。在这台主机上,我可以使用这个简单的 docker-compose 文件 (kube-compose.yml) 运行堆栈部署以将容器部署到 Kubernetes:
version: '3.3'
services:
web:
image: dockerdemos/lab-web
volumes:
- "./web/static:/static"
ports:
- "9999:80"
这个命令行从包含撰写文件的目录运行:
docker stack deploy --compose-file ./kube-compose.yml simple_test
但是,当我尝试从我的 Jenkins 容器中运行相同的命令时,Jenkins 会返回:
该节点不是集群管理器。使用“docker swarm init”或“docker swarm join”将此节点连接到swarm,然后重试
我不希望为 swarm 初始化 Jenkins 容器中的 docker 客户端,因为我没有在主机上使用 Docker swarm。
Jenkins 容器在 docker-compose 中定义,以包含到 docker 主机套接字端点的卷挂载:
version: '3.3'
services:
jenkins:
# contains embedded docker client & blueocean plugin
image: jenkinsci/blueocean:latest
user: root
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home
# run Docker from the host system when the container calls it.
- /var/run/docker.sock:/var/run/docker.sock
# root of simple project
- .:/home/project
container_name: jenkins
我还按照本指南使用 socat 代理对 docker 主机的请求:https ://github.com/docker/for-mac/issues/770和这里:Docker-compose: deploying service in multiple hosts。
最后,我使用以下 Jenkins 定义 (Jenkinsfile) 来调用堆栈以部署在我的主机上。Jenkins 安装了 Jenkins docker 插件:
node {
checkout scm
stage ('Deploy To Kube') {
docker.withServer('tcp://docker.for.mac.localhost:1234') {
sh 'docker stack deploy app --compose-file /home/project/kube-compose.yml'
}
}
}
我还尝试将 withServer 签名更改为:
docker.withServer('unix:///var/run/docker.sock')
我得到相同的错误响应。但是,我能够从 Jenkins 容器远程登录到 docker 主机,所以我知道它是可以访问的。另外,正如我之前提到的,我知道消息说要运行 swarm init,但我没有部署到 swarm。
我检查了 Jenkins 容器中 docker 客户端的版本,它与我在主机上使用的版本相同(不过是 Linux 变体):
Docker 版本 18.06.1-ce,构建 d72f525745
这是我描述的代码:https ://github.com/ewilansky/localstackdeploy.git
请让我知道是否可以从 Jenkins 容器中做我希望做的事情。所有这些的目的是提供一个简单、可移植的管道演示,部署到 Kubernetes 是最后一步。我知道这不是在本地开发环境之外的任何地方都可以采用的方法。