#docker #jenkins #copy #cp
#docker #дженкинс #Копировать #cp
Вопрос:
Это мой файл jenkins:
pipeline {
agent any
stages {
stage('Build') {
steps {
echo '####################################################
echo 'Building Docker container'
echo '####################################################
script {
sh 'docker build -t my-gcc:1.0 .'
}
}
}
stage('Run') {
steps {
echo '##########################################################
echo 'Running Docker Image'
echo '##########################################################
script {
sh 'docker run --privileged -i my-gcc:1.0'
sh 'docker cp my-gcc:1.0:/usr/src/myCppProject/build/*.hex .'
}
}
}
stage('Program') {
steps {
echo '#######################################################
echo 'Programming target '
echo '#######################################################
script {
sh 'openocd -d0 -f board/st_nucleo_f4.cfg -c "init;targets;ha<flash write_image erase Testbench.hex;shutdown"'
}
}
}
}
}
образ docker создается, а затем запускается, после этого я хотел бы извлечь шестнадцатеричный файл из контейнера в рабочий каталог jenkins, чтобы я мог перенести его на плату.
Но когда я пытаюсь скопировать файл, я получаю эту ошибку:
docker cp my-gcc:1.0:1.0:/usr/src/myCppProject/build/*.hex .
Error: No such container:path: my-gcc:1.0:1.0:/usr/src/myCppProject/build/*.hex
Я пытался получить доступ к другим папкам в контейнере и скопировать содержимое, но всегда одна и та же ошибка. Таким образом, кажется, что я не могу получить доступ к какой-либо папке или файлу в контейнере.
Что я делаю не так?
С уважением, Мартин
Ответ №1:
Дженкинс имеет некоторую стандартную поддержку Docker; это описано в разделе Использование Docker с конвейером в документации Jenkins. В частности, Дженкинс знает, как использовать образ Docker, содержащий только инструменты, в сочетании с каталогом рабочей области проекта. Я бы использовал эту поддержку вместо того, чтобы пытаться писать сценарий docker cp
.
Это может выглядеть примерно так:
pipeline {
agent none
stages {
stage('Build') {
// Jenkins will run `docker build` for you
agent { dockerfile { args '--privileged' } }
steps {
// The current working directory is bind-mounted into the container;
// the image's `ENTRYPOINT`/`CMD` is ignored.
// Copy the file out of the container:
sh "cp /usr/src/myCppProject/build/*.hex ."
}
}
stage('Program') {
agent any // so not in Docker
steps {
sh 'openocd -d0 -f board/st_nucleo_f4.cfg -c "init;targets;ha<flash write_image erase Testbench.hex;shutdown"'
}
}
}
}
Если вы используете этот подход, также подумайте, следует ли запускать основную последовательность сборки с помощью шагов конвейера Jenkins, или sh
вызова, который запускает сценарий оболочки, или Makefile, или если Dockerfile на самом деле правильный. Возможно, имеет смысл создать образ Docker из вашего настроенного компилятора, но затем использовать поддержку конвейера Jenkins для создания образа для целевой платы, а не пытаться сделать все это в Dockerfile.
В показанном вами вызове вы не можете напрямую docker cp
извлечь файл из изображения. Когда вы запускаете контейнер, используйте docker run --name
, чтобы присвоить ему имя, затем docker cp
из этого имени контейнера.
sh 'docker run --name builder ... my-gcc:1.0'
sh 'docker cp builder:/usr/src/myCppProject/build/*.hex .'
sh 'docker rm builder'
Комментарии:
1. Привет, Дэвид, большое спасибо за ваш ответ. Я вижу, что использование интегрированной поддержки docker кажется более элегантным способом. Немного просто ради любопытства: sh ‘docker run —name builder … my-gcc: 1.0’sh ‘docker cp builder:/usr/src/myCppProject/build/*.hex .’sh ‘docker rm builder’ должен работать?
2. Первый подход работает как шарм! 🙂 Второй (похожий на мой оригинал) по-прежнему не работает и заканчивается с той же ошибкой. Что касается вашего вопроса о процессе сборки, я использую bitbuckets, который запускает конвейер Дженкинса при каждом нажатии. Итак, я подумал, что файл Jenkins, который запускает docker, который собирает все, является более или менее единственным вариантом. Есть ли другие?