为 Spring Boot 应用程序基于“openjdk:8-jdk-alpine”构建 docker 映像时无法运行“./mvnw clean install”

Posted

技术标签:

【中文标题】为 Spring Boot 应用程序基于“openjdk:8-jdk-alpine”构建 docker 映像时无法运行“./mvnw clean install”【英文标题】:Unable to run './mvnw clean install' when building docker image based on "openjdk:8-jdk-alpine" for Spring Boot app 【发布时间】:2019-03-15 20:41:12 【问题描述】:

我想在 docker 容器中使用 spring.io.starter 提供的 maven 包装器构建一个 Spring Boot 应用程序。 我的 Dockerfile 是:

FROM openjdk:8-jdk-alpine
# install bash --> commented because I just need /bin/sh which is already provided by the base image
#RUN apk add --no-cache bash
ENV APP_DIR /app
ENV APP app.jar
WORKDIR $APP_DIR
COPY . $APP_DIR
# ===> HERE THE PROBLEM
RUN /bin/sh -c "./mvnw clean install"
ENTRYPOINT ["java","-jar","chicowa-app.jar"]
EXPOSE 8080

我有这个错误:

/bin/sh: ./mvnw: not found

经过一些研究,我仍然没有找到解决方案。 我的码头工人版本 Docker version 18.06.1-ce, build e68fc7a 在 Windows10 专业版上

非常感谢您的帮助。

编辑

解决方案是直接使用 RUN apk add --no-cache maven 安装 maven,但我想尽可能减小图像的大小。

【问题讨论】:

嗯 $APP_DIR 的值是多少 ENV APP_DIR /app 这是所有文件复制到的目录 【参考方案1】:

我们只在 Windows 10 上试验了这个问题,并且能够通过应用 dos2unix 解决这个问题

dos2unix mvnw

【讨论】:

【参考方案2】:

我在 Window 10 中构建 Dockerfile 时遇到了同样的问题。 这是因为 mvnw 文件在行尾包含 CRLF (\r\n)。我用记事本++打开它并使用查找\r\n并替换为\n(选中扩展(\n,\r,...))。您可以使用 dos2unix 工具进行转换,如上面@Juanan 所说。

之后,构建运行没有问题。

【讨论】:

有同样的问题,替换行尾工作完美。谢谢。【参考方案3】:

除非您在文件 mvnw 所在的确切位置运行脚本,否则它将无法工作。

如果您的 PATH 设置正确,并且 Maven 安装在合适的位置,只需删除命令前面的“./”即可。

RUN /bin/sh -c “mvnw clean install”

如果 mvnw 不在您的 PATH 中,您可以在脚本中指定完整路径(但要认识到 Maven 可能会调用其他需要相同 PATH 更改的东西)。

【讨论】:

我删除了 ./ 但结果相同。我不想安装 Maven 那么“如果您的 PATH 设置正确,并且 Maven 安装在合适的位置......”是什么意思 如果你没有安装maven,那么mvnw是不存在的,你的问题没有解决办法,不包括安装maven。 我想你没有理解我的问题。看看这里关于maven wrapperbaeldung.com/maven-wrapper 我确实误会了,也就是说,我不确定为什么该页面声称您不需要安装 maven。 maven wrapper 的安装说明专门使用了 Maven。没有它,您无法将其添加到项目中并下载所需的文件。 cd your_project mvn -N io.takari:maven:wrapper 祝你好运。 我在我的 PC 上进行了测试,我从 PATH 中删除了 MAVEN_HOME,在我的项目中运行 ./mvnw clean install 并且它有效。所以那个页面的作者是绝对正确的。【参考方案4】:

如果您已经配置了 maven,那么您可以运行以下命令:-

mvn clean install

它将无缝构建 docker 映像。

【讨论】:

谢谢!这对我有用【参考方案5】:

如果您使用的是 windows git 可能会将 mvnw 文件的行尾更改为 CRLF。如果您使用任何文本编辑器打开文件并将其保存到 LF,它可能会起作用。

【讨论】:

【参考方案6】:

使用

RUN chmod +x mvnw 

使用前

./mvnw clean install 

它会让你的 mvnw 文件可执行

【讨论】:

【参考方案7】:

这是可行的解决方案,因为我在任何地方都找不到此解决方案:

mvnw -版本 错误: java.security.InvalidAlgorithmParameterException:trustAnchors 参数必须是 非空

根本原因: java 信任库中缺少 maven 公共证书

解决方案:

    从https://repo.maven.apache.org 下载 - repo.maven.apache.org 叶证书并将其保存为 repo_maven.cer 格式的 base64 文件 将 repo_maven.cer 安装到 cacerts (truststore) keytool -import -keystore "...\openjdk-8u41\jre\lib\security\cacerts" -file "repo_maven.cer" -alias maven

输出: mvnw-版本 阿帕奇 Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)

【讨论】:

以上是关于为 Spring Boot 应用程序基于“openjdk:8-jdk-alpine”构建 docker 映像时无法运行“./mvnw clean install”的主要内容,如果未能解决你的问题,请参考以下文章

161103Spring Boot 入门

如何将基于 Spring Boot 构建的依赖项使用到典型的 Spring 应用程序中?

为 Spring Boot 应用程序基于“openjdk:8-jdk-alpine”构建 docker 映像时无法运行“./mvnw clean install”

将现有的 Spring 应用程序转换为 Spring-Boot

单个 Spring Boot 应用程序中的 SAML 和 Oauth2

基于Spring Boot自建分布式基础应用