我目前正在Jenkins中尝试一个简单的脚本管道。我的项目中有一些需要运行S3服务器的测试。这就是为什么我在使用Minio。
这是我制作的Jenkinsfile
:
node {
docker.image('minio/minio').withRun('-p 9000:9000 -e "MINIO_ACCESS_KEY=mykey" -e "MINIO_SECRET_KEY=mysecret"', 'server /data') { c ->
docker.image('maven:3.5.2-jdk-8-alpine').inside() {
sh 'mvn clean package'
}
}
}
Minio服务器似乎已启动,但是在测试中,我试图访问localhost:9000,但出现以下异常:
com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to localhost:9000 [localhost/127.0.0.1] failed: Connection refused (Connection refused)
使用Docker在本地启动Minio并运行本地Maven时,我没有任何问题。
任何的想法?
最佳答案
minio/minio
容器的容器端口9000映射到主机端口9000。maven:3.5.2-jdk-8-alpine
容器也已启动,但是它对minio
容器本身或主机没有任何网络访问权限。因此,在curl localhost:9000
内部运行类似maven:3.5.2-jdk-8-alpine
的操作不会得到响应。
当您在笔记本电脑上运行时,我猜您正在使用minio
选项运行-p 9000:9000
容器,但您正在从笔记本电脑运行mvn clean package
。该端口已映射到笔记本电脑的9000
,从笔记本电脑运行类似curl localhost:9000
的命令将获得响应。
您需要做的是使minio/minio
容器可访问maven:3.5.2-jdk-8-alpine
容器。使用container networking有几种不同的方法。一种方法是使用a user defined bridge network:
node {
sh 'docker network create --driver bridge minio-net'
docker.image('minio/minio').withRun('--network-alias minio --net minio-net -e "MINIO_ACCESS_KEY=mykey" -e "MINIO_SECRET_KEY=mysecret"', 'server /data') { c ->
docker.image('maven:3.5.2-jdk-8-alpine').inside('--net minio-net') {
sh 'nc -zv minio 9000'
sh 'mvn clean package'
}
}
sh 'docker network rm minio-net'
}
在此示例中:
minio-net
minio/minio
容器以网络范围别名minio-net
minio
容器nc
用于在构建步骤minio:9000
的连接您可能需要注入(inject)一个环境变量或一些东西来引用minio服务的位置,这可能是笔记本电脑上的
localhost
,但其他位置取决于执行方式。注:为了简洁起见,我对网络名称进行了硬编码,并假定没有失败
关于docker - 无法访问Jenkins管道创建的容器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49134911/