【问题标题】:Unable to execute the maven command by using the sh file in docker image使用docker镜像中的sh文件无法执行maven命令
【发布时间】:2021-01-07 19:02:50
【问题描述】:

我正在使用包含所有 maven 配置、密钥、maven 命令和所有内容的 sh 文件,我想从 Dockerfile 中执行这个 sh 文件,以便在我运行容器时执行 sh 文件。

这就是我的 Docker 文件的样子:

#using alpine jdk
FROM somewhere.docker.hub/build/alpine:latest AS fetch

#MVN as build tool
FROM somewhere.docker.hub/build/maven:3.5.3-jdk-8 AS build

#Settings.xml for downloading dependencies from nexus repository
ARG MVN_SETTINGS=settings.xml

#Defining the current working repository
WORKDIR /usr/src/app


#Coping the pom.xml into working directory
COPY pom.xml /usr/src/app

COPY ${MVN_SETTINGS} /usr/src/app/settings.xml

# Download the package and make it cached in docker image
#RUN mvn -B -f ./pom.xml -s settings.xml dependency:resolve


#Coping the source code into the working repository
COPY  . /usr/src/app


#Run the sh file
#RUN chmod a+x /usr/src/app/DockerTest.sh

# Not using the full path of DockerTest.sh file because it is already in the work directory as defined above
RUN chmod a+x DockerTest.sh

DockerTest.sh 文件如下所示。

#!/bin/sh
mvn clean install
mvn test

当我创建 docker 映像并运行该映像时,它会显示此错误。 试了很多方法还是不行,提示这个错误

没有为此构建指定目标。您必须以 : 或 :[:]: 格式指定有效的生命周期阶段或目标。可用的生命周期阶段有:验证、初始化、生成源、流程源、生成资源、流程资源、编译、流程类、生成测试源、流程测试源、生成测试资源、流程-test-resources、test-compile、process-test-classes、test、prepare-package、package、pre-integration-test、integration-test、post-integration-test、verify、install、deploy、pre-clean、clean ,清理后,站点前,站点,站点后,站点部署。 -> [帮助 1]

【问题讨论】:

  • 你确定不执行mvn 没有任何参数,不知何故?

标签: java docker maven dockerfile


【解决方案1】:

首先,您不能通过使用多个FROM 行一个接一个地组合两个Docker 映像。甚至可以指定多个的原因是启用multi-stage builds

其次,如果你不使用这一行:

RUN mvn -B -f ./pom.xml -s settings.xml dependency:resolve

你也可以评论这个:

COPY pom.xml /usr/src/app

因为您的 POM 将与源代码的其余部分一起复制。

第三,从你的 Dockerfile 来看,你的工作目录中有几个 settings.xml 文件,你想根据构建参数选择一个。但是,如果您说 settings.xmlsettings.prod.xml 并将 MVN_SETTINGS 设置为 settings.prod.xml,那么 /usr/src/app/settings.xml 将被此行覆盖:

COPY  . /usr/src/app

settings.xml.

第四,mvn clean installruns tests as well,不需要单独做mvn test

最后,对于您注意到的问题。我不确定您在运行映像时期望发生什么,但您没有指定要在 Dockerfile 中运行的任何入口点或命令,因此您的映像从其基础继承了默认的。现在假设somewhere.docker.hub/build/maven:3.5.3-jdk-8实际上是指docker.io/library/maven:3.5.3-jdk-8,那么命令是mvn,入口点是/usr/local/bin/mvn-entrypoint.sh(请参阅Dockerfile以获得稍新的图像here)。

话虽如此,假设您想在运行映像时运行DockerTest.sh,您的Dockerfile 应该如下所示:

FROM maven:3.5.3-jdk-8
ARG MVN_SETTINGS=settings.xml
WORKDIR /usr/src/app
COPY . .
COPY ${MVN_SETTINGS} settings.xml
RUN chmod a+x DockerTest.sh
CMD ./DockerTest.sh

另外,如果您真的想在构建期间使用您的 settings.xml,您需要将您的 DockerTest.sh 更改为:

#!/bin/sh
mvn --settings /usr/src/app/settings.xml clean install

您还可以通过以下方式删除不必要的两次复制同一文件:

FROM maven:3.5.3-jdk-8
ARG MVN_SETTINGS=/usr/src/app/settings.xml
ENV MVN_SETTINGS=${MVN_SETTINGS}
WORKDIR /usr/src/app
COPY . .
RUN chmod a+x DockerTest.sh
CMD ./DockerTest.sh

#!/bin/sh
mvn --settings "$MVN_SETTINGS" clean install

【讨论】:

  • RUN mvn -B -f ./pom.xml -s settings.xml dependency:resolve 当我取消注释此行以使用缓存中的依赖项并运行 docker 映像时,它会一次又一次地下载依赖项,每次我运行 docker 文件时,我都希望它得到来自 docker 的依赖,当我再次运行图像时不要下载。
  • 那是因为复制新的 pom.xml 会使下面的所有层失效。
  • 现在我正在复制所有特定文件夹,也没有覆盖 pom 文件,但它仍在一次又一次地下载依赖项-请帮助。
  • 请在此处查看更新后的问题stackoverflow.com/questions/64115576/…
猜你喜欢
  • 2015-06-07
  • 2019-08-14
  • 1970-01-01
  • 2023-03-20
  • 2019-07-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多