Дженкинс не ждет завершения команды docker exe c - PullRequest
0 голосов
/ 18 февраля 2020

Вот ситуация:

У меня есть docker контейнер (Дженкинс). Я установил сокеты в свой контейнер, чтобы я мог выполнять команды docker внутри своего контейнера jenkins.

Вручную все работает в контейнере. Однако, когда Jenkins выполняет задание, он не «ожидает» выполнения команды docker exec до ее завершения.

Ниже приводится выдержка из файла Jenkinsfile. Краткосрочная команда printenv выполняется правильно и печатает переменные среды. Следующая команда (python) просто запускается, и затем Дженкинс сразу же начинает двигаться, не дожидаясь завершения. Агент Дженкинс (раб) работает на образе Ubuntu. Выполнение всех этих команд вне Jenkins работает должным образом.

echo "Running the app docker container in detached tty mode to keep it up"
docker run --detach --tty --name "${CONTAINER_NAME}" "${IMAGE_NAME}"

echo "Listing environment variables"
docker exec --interactive "${CONTAINER_NAME}" bash -c "printenv"

echo "Running test coverage"
docker exec --interactive "${CONTAINER_NAME}" bash -c "python -m coverage run --source . --branch -m pytest -vs"

Возможно, это связано с этим вопросом .

Может кто-нибудь объяснить, как заставить Дженкинса ждать docker exec, чтобы выполнить команду, прежде чем переходить к следующему шагу.

Рассмотрели альтернативы, такие как Docker Pipeline Plugin, но предпочли бы использовать что-то близкое к тому, что у меня было выше, где это возможно.

Хорошо, другой подход, я пытался использовать Docker Плагин конвейера здесь .

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вы можете использовать docker.sock в качестве монтирования тома для организации контейнеров на вашем хост-компьютере, например, на вашем docker-compose.yml

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

В зависимости от настроек вам может потребоваться запустить

chmod 666 /var/run/docker.sock

чтобы начать работу.

Это работает на macOS так же, как и Linux.

0 голосов
/ 19 февраля 2020

Тьфу. Это было связано с тем, что я установил поддержку docker на подчиненном контейнере.

Я использовал socat для предоставления прокси-сервера TCP. Вместо этого переключите это для простого старого тома docker.sock между хостом и контейнером.

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

В первый раз мне пришлось также разобраться с проблемой разрешений, выполнив (внутри контейнера):

rm -Rf ~/.docker 
chmod 666 /var/run/docker.sock

После этого все "просто заработало". Очень болезненный опыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...