我目前正在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时,我没有任何问题。
有什么想法吗?
答案 0 :(得分:2)
您的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
的连接你可能想要注入一个环境变量或某些东西来引用minio服务的位置,这可能是你的笔记本电脑上的localhost
,但取决于它的执行方式。
注意:我为了简洁而对网络名称进行了硬编码,并假设没有失败