На своем хосте OS X я использую Docker CE (18.06.1-ce-mac73 (26764)) с включенным Kubernetes и оркестровкой Kubernetes. С этого хоста я могу запустить развертывание стека для развертывания контейнера в Kubernetes, используя этот простой файл для создания докеров (kube-compose.yml):
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 и повторить попытку.
Я не хочу, чтобы клиент Docker в контейнере Jenkins был инициализирован для роя, так как я не использую рой Docker на хосте.
Контейнер 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: https://github.com/docker/for-mac/issues/770 и здесь: Docker-compose: развертывание сервиса на нескольких хостах.
Наконец, я использую следующее определение Jenkins (Jenkinsfile) для стека вызовов для развертывания на моем хосте. В Jenkins установлен подключаемый модуль докера Jenkins:
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')
и я получаю тот же ответ об ошибке. Однако я могу подключиться по telnet к хосту докера из контейнера Jenkins, поэтому я знаю, что он доступен. Кроме того, как я упоминал ранее, я знаю, что в сообщении говорится о запуске swarm init, но я не развертываю swarm.
Я проверил версию клиента докера в контейнере Jenkins, и это та же версия (однако вариант Linux), которую я использую на своем хосте:
Докер версии 18.06.1-ce, сборка d72f525745
Вот код, который я описал: https://github.com/ewilansky/localstackdeploy.git
Пожалуйста, дайте мне знать, возможно ли сделать то, что я надеюсь сделать из контейнера Jenkins. Цель всего этого — предоставить простую переносимую демонстрацию конвейера, а развертывание в Kubernetes — последний шаг. Я понимаю, что это не тот подход, который можно было бы использовать за пределами локальной среды разработки.