Jenkinsfile管道:到达主机sidecar的ip

时间:2018-10-29 15:07:11

标签: docker jenkins kubernetes jenkins-pipeline

我正在使用Kubernetes插件在GKE上运行Jenkins。我添加了一个postgres容器作为jnlp代理容器的补充。它可以在localhost:5432上从代理访问。我还将GKE节点的Docker套接字和bin安装在代理中,以便启动“姐妹”容器。这也很好。

现在我要执行以下操作:

pipeline {

    stages {

        stage('pytest') {

            agent {
                docker {
                    image "<image created in a previous stage>"
                    args '--add-host=database:\$(hostname\\ -i)'
                }
            }

            steps {
                // use postgres in sidecar of jnlp agent
                // e.g. on `database:5432`
            }
        }
    }
}

手动执行此操作效果很好,但是在Jenkins中,上述操作失败并显示:

Error: invalid argument "database:$(hostname -i)" for --add-host=database:$(hostname -i): invalid IP address in add-host: "$(hostname -i)"

有人对如何摆脱上述想法有想法吗?还是解决这个问题的完全不同的方式?

我在GKE上没有可用的Docker 18.03+(卡在17.03.2-ce上),所以我不能host.docker.internal

docker run --network host也不执行任何操作。

1 个答案:

答案 0 :(得分:0)

如果它是一种辅助工具,则不需要$(hostname),您应该可以与localhost:5432连接。容器中的容器共享相同的地址空间。

另一种选择是在pod规范中使用initContainers来设置所需的文件。您可以这样编写bash脚本:

#!/bin/bash
cat <<EOF
pipeline {

    stages {

        stage('pytest') {

            agent {
                docker {
                    image "<image created in a previous stage>"
                    args "--add-host=database:${HOSTMAME}"
                }
            }

            steps {
                // use postgres in sidecar of jnlp agent
                // e.g. on `database:5432`
            }
        }
    }
}
EOF > /your-config-file

${HOSTNAME}是窗格中的环境变量。