首页 > 解决方案 > 使用docker镜像中的sh文件无法执行maven命令

问题描述

我正在使用包含所有 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]

标签: javadockermavendockerfile

解决方案


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

其次,如果您不使用此行:

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

你也可以评论这个:

COPY pom.xml /usr/src/app

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

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

COPY  . /usr/src/app

settings.xml.

第四,mvn clean install 也运行测试,不需要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的稍新的图像)。

综上所述,假设您想在运行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

推荐阅读