docker - Jenkins docker容器无法将war文件部署到tomcat docker容器
问题描述
我无法让 Jenkins 在 Tomcat8 服务器上部署战争文件。为什么 Jenkins 不能部署到 Tomcat?
当我运行 Jenkins 作业时,我得到了这个异常:
[DeployPublisher][INFO] Deploying /var/jenkins_home/workspace/Deploy_to_Tomcat_server/webapp/target/webapp.war to container Tomcat 8.x Remote with context null
ERROR: Build step failed with exception
java.net.ConnectException: Connection refused (Connection refused)
我认为这两个 docker 容器都存在问题,所以我将描述我所做的事情。
Jenkins 服务器和 Tomcat8 都在我的本地机器上运行在 docker 容器中。为了让双方都能看到对方,我创建了一个公共网络。
~ % docker network ls
NETWORK ID NAME DRIVER SCOPE
da6fc157710c bridge bridge local
...
// network bridge already exists!
~ % docker network create --driver bridge my_jenkins_tomcat_network
378ef3f01e215207e90ca0a6e93e89a9610be1e9bd972f94f02f9b1ce6199923
**// Run jenkins container**
~ % docker run -d -p 8080:8080 --name jenkins_container_test --network my_jenkins_tomcat_network jenkinsci/blueocean
08a2ce5e609f0c50e3a4c9ce73a5c88918e6a0ab69c582d75bc44162ae7e58fd
**// Run tomcat container. I had an image name mywebapp with Tomcat8...**
~ % docker run -d -p 80:8080 --name tomcat_container_test --network my_jenkins_tomcat_network mywebapp
5ac868dbeb69512c7c2d5b62f067de72592a01e763cf5b20808d22c06de1fe0e
~ % docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ac868dbeb69 mywebapp "catalina.sh run" 9 seconds ago Up 8 seconds 0.0.0.0:80->8080/tcp tomcat_container_test
08a2ce5e609f jenkinsci/blueocean "/sbin/tini -- /usr/…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins_container_test
我可以检查容器和新网络:
~ % docker network ls
NETWORK ID NAME DRIVER SCOPE
da6fc157710c bridge bridge local
378ef3f01e21 my_jenkins_tomcat_network bridge local
~ % docker inspect my_jenkins_tomcat_network
[
{
"Name": "my_jenkins_tomcat_network",
"Id": "378ef3f01e215207e90ca0a6e93e89a9610be1e9bd972f94f02f9b1ce6199923",
"Created": "2021-04-12T08:07:52.770548349Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.23.0.0/16",
"Gateway": "172.23.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"08a2ce5e609f0c50e3a4c9ce73a5c88918e6a0ab69c582d75bc44162ae7e58fd": {
"Name": "**jenkins_container_test**",
"EndpointID": "80adf0fe02288d76f24e675ad0fdf25bf89ac64ac135dee03cdd4b91a74a6d3e",
"MacAddress": "02:42:ac:17:00:02",
"IPv4Address": "**172.23.0.2/16**",
"IPv6Address": ""
},
"5ac868dbeb69512c7c2d5b62f067de72592a01e763cf5b20808d22c06de1fe0e": {
"Name": "**tomcat_container_test**",
"EndpointID": "ca216dc9302db6eee66393d9210aab4e4236c7442dba5c3701bcebc11b2e9463",
"MacAddress": "02:42:ac:17:00:03",
"IPv4Address": "**172.23.0.3/16**",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
我可以在 Jenkins 容器中执行 bash 并 ping tomcat 容器:
~ % docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ac868dbeb69 mywebapp "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:80->8080/tcp tomcat_container_test
08a2ce5e609f jenkinsci/blueocean "/sbin/tini -- /usr/…" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins_container_test
~ % docker exec -it -u:root 08a2ce5e609f bashh
OCI runtime exec failed: exec failed: container_linux.go:370: starting container process caused: exec: "bashh": executable file not found in $PATH: unknown
aironman@MacBook-Pro-de-Alonso ~ % docker exec -it -u:root 08a2ce5e609f bash
bash-5.0# ping 172.23.0.3
PING 172.23.0.3 (172.23.0.3): 56 data bytes
64 bytes from 172.23.0.3: seq=0 ttl=64 time=0.163 ms
64 bytes from 172.23.0.3: seq=1 ttl=64 time=0.139 ms
...
在我的 tomcat 容器中,我使用以下默认内容修改了 tomcat-users.xml 文件:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
**<user username="deployer" password="deployer" roles="manager-script"/>**
当我创建 Jenkins 作业时,我使用凭据部署程序和 tomcat url,如上所示
我也尝试过内部ip,172.23.0.3,没有运气。
我已经阅读了这个链接,没有回复,而且有点不同,所以我认为回答这个问题是合法的。
解决方案
实现这个目标的一种方法是安装这个插件,在 tomcat 容器中配置 sshd 并在 Jenkins 中创建一个 post 任务,以便将 war 文件复制到 webapps 文件夹。
推荐阅读
- php - 当我使用 auto_prepend_file 时,$_SERVER['HTTP_USER_AGENT'] 不起作用
- excel - 在 Excel 中提取两个字符之间的特定文本字符串部分
- git - 如何诊断 git cat-file 声称缺少对象?
- c++ - 带有 std::thread 类的 C++ 堆栈泄漏
- java - 使用 @EmbeddedId 生成无效 SQL 的 CriteriaQuery selectDistinct
- compiler-construction - Given a recursive descent parser, how should I modify it for Syntax Analysis?
- reactjs - 如何将焦点移到reactjs中的错误字段
- c - 使用 memcpy 连接两个 int 数组
- youtube-iframe-api - 在 Iframe 内,Youtube 播放器取消静音功能停止工作
- javascript - 不要隐藏切换的 div