当前位置: 首页 > 知识库问答 >
问题:

无法使用docker映像中的sh文件执行maven命令

颜镜
2023-03-14

我正在使用包含所有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图像并运行该图像时,它显示了这个错误。我试过很多东西,但仍然不起作用,这表明了这个错误

尚未为此生成指定目标。您必须以以下格式指定有效的生命周期阶段或目标:或:[:]。可用的生命周期阶段包括:验证、初始化、生成源、流程源、生成资源、流程资源、编译、流程类、生成测试源、流程测试源、生成测试资源、流程测试资源、测试编译、流程测试类、测试、准备包、包、集成前测试、集成测试、集成后测试、验证、安装、,部署,预清理,清理,后清理,前站点,站点,后站点,站点部署-

共有1个答案

姬经义
2023-03-14

首先,您不能通过使用多个行逐个组合两个Docker图像。甚至可以指定多个的原因是为了支持多阶段构建。

其次,如果您没有使用这一行:

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 install也运行测试,不需要单独进行mvn测试。

最后,对于您注意到的问题。我不确定您运行映像时会发生什么,但是您没有指定要在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)。

综上所述,假设您想在运行映像时运行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
 类似资料:
  • 问题内容: 我将如何执行.SH文件(这是localhost,没有远程连接或其他任何内容)?当我进行搜索时,我看到了很多其他东西,但这些似乎没有用。 这是Java6。同样重要的是,SH所做的只是在移动两个文件夹。 谢谢! 问题答案: 您可以使用ProcessBuilder

  • 问题内容: 我将如何执行.SH文件(这是localhost,没有远程连接或其他任何内容)?当我进行搜索时,我看到了很多其他东西,但这些似乎没有用。 这是Java6。同样重要的是,SH所做的只是在移动两个文件夹。 谢谢! 问题答案: 您可以使用ProcessBuilder

  • 我是docker和dockerfile文件的新手,刚刚开始尝试编写它们。我已经构建了一个简单的java控制台应用程序,可以成功地从dockerfile构建docker映像,但是如果我包括 当我尝试运行映像时,总是会出现bin/sh错误,通常是“java未找到”之类的错误。 但是,当我不包含CMD行时,只需使用此Dockerfile来构建我的映像 然后再跑 然后我就可以跑了 应用程序按预期运行。 我

  • 我试图建立我自己的dokcher图像基于一个简单的Spring引导项目,使用的是Fabch8 maven插件,这是我的配置 正如其他帖子所建议的那样,我公开了我的docker doamon,但当我在Intellij中运行此命令行时,一切都不起作用 我得到了这个堆栈跟踪 我是否需要在我的机器上创建本地docker中心(Docker桌面)。问题是,当我使用命令行窗口CMD,我去那里docker文件存在

  • 我正在使用sh文件,其中包含所有专家配置,密钥,专家命令。当我运行容器时,它每次都会一次又一次地下载依赖项,它无法缓存依赖项。 下面是我的Dockerfile的外观: 下面是Test.sh文件 当我创建docker映像并运行容器时,每当我运行它时,它就会一次又一次地下载依赖项。

  • 在更新到Appengine版本1.9.10后,我无法使用maven命令mvn Appengine:update直接在Appengine上部署应用程序,并引发以下异常: [错误]找不到目标“update;”在plugin com.google.appengine中:appengine-maven-plugin:1.9.10在可用目标中[错误]使用-x开关重新运行Maven以启用完全调试日志记录。[错