尝试使用 bitbucket 管道调用 docker 中的 url 服务
Trying to call an url of service in docker with bitbucket pipelines
我正在尝试测试 docker 容器中的服务 运行 是否正常,所以我想调用 url 'http://localhost:3000/test' 并检查它是否为 200 . 在所有其他情况下,我想让我的 bitbucket 管道失败。
所以一开始我尝试 curl 它,但我没有得到任何输出或错误。
curl -f "http://localhost:3000/test" || exit 1
但无论如何它还是通过了,即使 url 不好或者容器根本不是 运行。
然后我尝试在容器中调用 wget
但我也没有成功。
docker exec -ti -t -i mycontainer sh -c "wget http://localhost:3000/test || exit 1" || exit 1
the input device is not a TTY
失败
感谢您的帮助。
首先删除 -ti -t -i
因为在管道中没有 tty 设备(终端)。 (-ti
等同于 -t -i
)
现在您的脚本可以检查 url 是否可达,要检查 200 响应代码,请使用
wget -q --spider --server-response 'http://localhost:3000/' "${url}" 2>&1 | diff -q <(echo 200) <(awk 'NR==1{print }')
第一部分解释的很好here,然后diff
看看响应码是不是200
你的最终命令看起来像
docker exec mycontainer sh -c "wget -q --spider --server-response 'http://localhost:3000/' "${url}" 2>&1 | diff -q "echo 200" <(awk 'NR==1{print }') || exit 1"
编辑
差异在这里有点矫枉过正,所以试试这个
wget -q --spider --server-response 'http://localhost:3000/' "${url}" 2>&1 | [ code`awk 'NR==1{print }'` == code200 ] || exit 1
前缀 "code" 用于在 wget 无法连接时抑制警告,awk return 不会导致 [ ]
抱怨。
这是我在其他答案的评论中建议的更简单的解决方案。如果您只想在出错时退出脚本,您可以简单地测试退出状态:
$ wget -q --spider http://localhost:3000/ || exit 1
哎呀,如果你想要更多的控制和错误报告,你甚至可以使用 $?
测试退出状态。 Wget returns 相当信息退出状态。在这里引用手册:
EXIT STATUS
Wget may return one of several error codes if it encounters problems.
0 No problems occurred.
1 Generic error code.
2 Parse error---for instance, when parsing command-line options, the .wgetrc or .netrc...
3 File I/O error.
4 Network failure.
5 SSL verification failure.
6 Username/password authentication failure.
7 Protocol errors.
8 Server issued an error response.
With the exceptions of 0 and 1, the lower-numbered exit codes take precedence
over higher-numbered ones, when multiple types of errors are encountered.
我正在尝试测试 docker 容器中的服务 运行 是否正常,所以我想调用 url 'http://localhost:3000/test' 并检查它是否为 200 . 在所有其他情况下,我想让我的 bitbucket 管道失败。
所以一开始我尝试 curl 它,但我没有得到任何输出或错误。
curl -f "http://localhost:3000/test" || exit 1
但无论如何它还是通过了,即使 url 不好或者容器根本不是 运行。
然后我尝试在容器中调用 wget
但我也没有成功。
docker exec -ti -t -i mycontainer sh -c "wget http://localhost:3000/test || exit 1" || exit 1
the input device is not a TTY
感谢您的帮助。
首先删除 -ti -t -i
因为在管道中没有 tty 设备(终端)。 (-ti
等同于 -t -i
)
现在您的脚本可以检查 url 是否可达,要检查 200 响应代码,请使用
wget -q --spider --server-response 'http://localhost:3000/' "${url}" 2>&1 | diff -q <(echo 200) <(awk 'NR==1{print }')
第一部分解释的很好here,然后diff
看看响应码是不是200
你的最终命令看起来像
docker exec mycontainer sh -c "wget -q --spider --server-response 'http://localhost:3000/' "${url}" 2>&1 | diff -q "echo 200" <(awk 'NR==1{print }') || exit 1"
编辑
差异在这里有点矫枉过正,所以试试这个
wget -q --spider --server-response 'http://localhost:3000/' "${url}" 2>&1 | [ code`awk 'NR==1{print }'` == code200 ] || exit 1
前缀 "code" 用于在 wget 无法连接时抑制警告,awk return 不会导致 [ ]
抱怨。
这是我在其他答案的评论中建议的更简单的解决方案。如果您只想在出错时退出脚本,您可以简单地测试退出状态:
$ wget -q --spider http://localhost:3000/ || exit 1
哎呀,如果你想要更多的控制和错误报告,你甚至可以使用 $?
测试退出状态。 Wget returns 相当信息退出状态。在这里引用手册:
EXIT STATUS Wget may return one of several error codes if it encounters problems.
0 No problems occurred. 1 Generic error code. 2 Parse error---for instance, when parsing command-line options, the .wgetrc or .netrc... 3 File I/O error. 4 Network failure. 5 SSL verification failure. 6 Username/password authentication failure. 7 Protocol errors. 8 Server issued an error response. With the exceptions of 0 and 1, the lower-numbered exit codes take precedence over higher-numbered ones, when multiple types of errors are encountered.