[spring-projects/spring-boot]记录 buildpack 使用非 root 用户来构建容器映像和运行容器

2024-04-12 717 views
7

2.3.0 版本仍然会导致“无法启动嵌入式 Tomcat 服务器”错误。

用于测试:v2.3.0.BUILD-SNAPSHOT

org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:229) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:309) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:165) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) ~[spring-context-5.2.6.BUILD-SNAPSHOT.jar:5.2.6.BUILD-SNAPSHOT]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at com.example.kunde.service.KundeServiceApplication.main(KundeServiceApplication.java:12) ~[classes/:na]
Caused by: java.lang.IllegalArgumentException: standardService.connector.startFailed
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:231) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:282) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:213) ~[spring-boot-2.3.0.BUILD-SNAPSHOT.jar:2.3.0.BUILD-SNAPSHOT]
    ... 11 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1038) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    ... 13 common frames omitted
Caused by: java.net.SocketException: Permission denied
    at java.base/sun.nio.ch.Net.bind0(Native Method) ~[na:na]
    at java.base/sun.nio.ch.Net.bind(Unknown Source) ~[na:na]
    at java.base/sun.nio.ch.Net.bind(Unknown Source) ~[na:na]
    at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source) ~[na:na]
    at java.base/sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source) ~[na:na]
    at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:229) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:212) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1141) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1227) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:592) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1035) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
    ... 15 common frames omitted

回答

5

返回 v2.2.6.RELEASE ...

Tomcat started on port(s): 80 (http) with context path '/kunde-api'
1

构建映像并通过docker run/运行时会出现问题helm install

所以这可能是 gradle-plugin 中新的图像生成器的问题?!

4

2.2.6(使用com.bmuschko.docker-spring-boot-application)->

docker {
    springBootApplication {
        baseImage = 'openjdk:11'
        ports = [80]
        images = ['localhost:32000/demo/kunde-service:latest']
    }
}

2.3.0 ->

bootBuildImage {
    imageName = 'localhost:32000/demo/kunde-service:latest'
}
8

“仍然”是什么意思?您指的是现有问题(在这种情况下您可以链接到它吗?)。另外,您能否提供一个示例应用程序,我们可以看一下(包含有关如何重现问题的详细说明)。我不明白这在 2.2.6 中是如何工作的,因为容器镜像构建功能是全新的。谢谢!

1

示例应用程序 https://github.com/octopus-prime/demo/tree/test-2.3.0

注意: bootBuildImage不推送到注册表。所以你必须自己推送图片

docker push localhost:32000/demo/kunde-service:latest
docker push localhost:32000/demo/produkt-service:latest
docker push localhost:32000/demo/rechnung-service:latest
5
20167 看起来像是一个不同的问题。由于 Tomcat 配置更改,连接器无法启动。

此堆栈跟踪指向用户权限问题(对于该用户来说,似乎不允许绑定到 80 端口)。也许其他构建插件对默认用户有不同的策略?

感谢您提供样本,我们将对其进行研究。

4

与 master 进行比较显示了我的更改。也许我在尝试 2.3.0 时错过了一些东西......

6

我怀疑 buildpack 以无权使用端口 80 的用户身份运行进程,而进程则无权使用端口 80 com.bmuschko.docker-spring-boot-application

也许@ekcasey 或@nebhale 可以确认这一点,并让我们知道是否有办法克服这些限制?

3

是的,将端口从 80 更改为 8080 可以解决问题...

Tomcat started on port(s): 8080 (http) with context path '/kunde-api'
3

作为一种安全措施,使用 CNB 相关系统构建的映像有意以非 root 用户身份构建和运行。没有真正的方法可以覆盖这些限制,您也不想这样做,但您应该进行必要的更改以作为非 root 用户运行应用程序。正如 @octopus-prime 所指出的,像更改端口这样简单的事情就足够了,并且考虑到所有 Dockerimage 运行系统的工作方式,您可以通过端口映射轻松获得相同的行为 ( -p 8080:80)。

8

非常感谢,@nebhale。我想在我们的参考文档中记录这一点。是否有一些 CNB 文档可供我们链接?

2

@wilkinsona 让我帮你调查一下。这是我们的销售宣传、口号和规格的一部分,但我认为没有任何面向用户的文档说明了这一点。