我的问题是:
我有一个共享文件夹emptyDirVolume(mountPath: '/home', memory: false),
好吧,我正在运行docker文件自动化测试,并且这些测试正在保存到docker容器主目录中的文件夹中。好吧,我想做的就是与容器节点共享该目录,然后使用gsutils
将结果上传到另一个容器。
我正在做的是docker run -v /home:/home/tests test
,但是节点容器的主目录为空。我在本地测试了dockerfile并且可以正常工作,这可行吗?
我将发布jenkinsfile和dockerfile的代码。
JENKINSFILE:
GString podName = "${name}-${UUID.randomUUID().toString()}"
podTemplate(name: "jnlp",
label: podName,
namespace: "jenkins",
containers: [
containerTemplate(name: 'node', image: 'gcr.io/xyz', ttyEnabled: true),
],
volumes: [
hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
emptyDirVolume(mountPath: '/home', memory: false),
secretVolume(secretName: 'kube-jenkins-gcloud-secret', mountPath: '/usr/opt/gcloud/.config')
])
{
node(podName) {
//stageWithSlackNotification() {
stage('build docker image') {
checkout scm
container('node') {
sh "docker build -t test ."
}
}
stage('test') {
checkout scm
container('node') {
currentBuild.displayName = env.BUILD_NUMBER
currentBuild.description = env.BUILD_NUMBER
sh "docker run -v /home:/home/tests test"
}
}
stage('testv2') {
checkout scm
container('node') {
sh "ls /home"
}
}
//}
}
}
DOCKERFILE
FROM gcr.io/xyz
# Create app directory
RUN mkdir -p /usr/opt/hold-ats
WORKDIR /usr/opt/hold-ats
COPY package* ./
RUN npm install
COPY src src
RUN mkdir -p /home/tests
CMD ["./node_modules/.bin/newman", "run", "src/collections/smoke_tests.json", "-e", "src/environments/dev.json", "--reporter-htmlextra-export", "/home/tests" ,"--reporter-htmlextra-darkTheme", "--reporter-htmlextra-testPaging", "-r", "htmlextra"]
有人知道吗?
谢谢!
答案 0 :(得分:1)
问题与在由Kubernetes管理的容器内执行jenkins管道阶段时使用docker deamon有关。
使用docker run
时,您拥有的docker deamon是主机上的docker deamon,如此处声明的那样:
hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
因此,当您使用卷映射-v /home:/home/tests
时,将使用主机的目录/home
,而不使用kubernetes插件创建的容器的/home
目录。
要解决此问题,您可以执行以下两项操作之一:
docker run
和kubernetes容器上访问。第二种选择似乎更简单,恕我直言,可以通过以下方式实现:
hostPathVolume(mountPath: '/home/tests', hostPath: '/tmp/tests'),
docker run -v /tmp/tests:/home/tests test
玩得开心!