为 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 wrapper
baeldung.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”的主要内容,如果未能解决你的问题,请参考以下文章
如何将基于 Spring Boot 构建的依赖项使用到典型的 Spring 应用程序中?
为 Spring Boot 应用程序基于“openjdk:8-jdk-alpine”构建 docker 映像时无法运行“./mvnw clean install”
将现有的 Spring 应用程序转换为 Spring-Boot