我一般对Jenkins Kubernetes插件和Kubernetes还是陌生的-https://github.com/jenkinsci/kubernetes-plugin
我想将插件用于CI中的E2E测试设置。
在我的Jenkinsfile
内,有一个podTemplate
,其外观和用法如下:
def podTemplate = """
apiVersion: v1
kind: Pod
spec:
containers:
- name: website
image: ${WEBSITE_INTEGRATION_IMAGE_PATH}
command:
- cat
tty: true
ports:
- containerPort: 3000
- name: cypress
resources:
requests:
memory: 2Gi
limit:
memory: 4Gi
image: ${CYPRESS_IMAGE_PATH}
command:
- cat
tty: true
"""
pipeline {
agent {
label 'docker'
}
stages {
stage('Prepare') {
steps {
timeout(time: 15) {
script {
ci_machine = docker.build("${WEBSITE_IMAGE_PATH}")
}
}
}
}
stage('Build') {
steps {
timeout(time: 15) {
script {
ci_machine.inside("-u root") {
sh "yarn build"
}
}
}
}
post {
success {
timeout(time: 15) {
script {
docker.withRegistry("https://${REGISTRY}", REGISTRY_CREDENTIALS) {
integrationImage = docker.build("${WEBSITE_INTEGRATION_IMAGE_PATH}")
integrationImage.push()
}
}
}
}
}
}
stage('Browser Tests') {
agent {
kubernetes {
label "${KUBERNETES_LABEL}"
yaml podTemplate
}
}
steps {
timeout(time: 5, unit: 'MINUTES') {
container("website") {
sh "yarn start"
}
container("cypress") {
sh "yarn test:e2e"
}
}
}
}
}
在Dockerfile
构建图像的过程中,我添加了ENTRYPOINT
ENTRYPOINT ["bash", "./docker-entrypoint.sh"]
但是,似乎它不是由kubernetes插件执行的。
我想念什么吗?
答案 0 :(得分:2)
根据Define a Command and Arguments for a Container文档:
您在配置文件中定义的命令和参数 覆盖容器提供的默认命令和参数 图片。
This表总结了Docker和Kubernetes使用的字段名称:
| Docker field name | K8s field name |
|------------------:|:--------------:|
| ENTRYPOINT | command |
| CMD | args |
定义command
意味着忽略您的Dockerfile ENTRYPOINT
:
当您覆盖默认的
ENTRYPOINT
和CMD
时,将应用以下规则:
- 如果您为容器提供
command
而不提供args
,则仅使用提供的command
。 Docker映像中定义的默认ENTRYPOINT
和默认CMD
被忽略。- 如果您仅为容器提供
args
,则默认为ENTRYPOINT
使用您提供的args
运行Docker映像中定义的命令。
因此,您需要用command
替换pod模板中的args
,这将保留Dockerfile ENTRYPOINT
(相当于Dockerfile CMD
)。