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

У меня есть контейнер с докером (Дженкинс). Я подключил сокеты к своему контейнеру, чтобы я мог выполнять команды докера внутри моего контейнера 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 Pipeline .

0
arcseldon 18 Фев 2020 в 19:59

2 ответа

Лучший ответ

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

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

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

chmod 666 /var/run/docker.sock

Чтобы начать идти в первую очередь.

Это работает как в MacOS, так и в Linux.

1
ckaserer 19 Фев 2020 в 16:55

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

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

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

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

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

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

0
arcseldon 19 Фев 2020 в 15:36