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

标签 java docker maven dockerfile

我正在使用包含所有 maven 配置、 key 、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]

最佳答案

首先你不能使用多个 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_SETTINGSsettings.prod.xml ,然后 /usr/src/app/settings.xml将被这一行覆盖:
COPY  . /usr/src/app
settings.xml .
四、mvn clean install runs 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

关于java - 使用docker镜像中的sh文件无法执行maven命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63996424/

相关文章:

java - 'SSSXXX'在java简单日期格式对象中意味着什么?

java - Eclipse 热代码替换不起作用

java - Log4j2 - 除 Spring 之外的调试级别日志记录

linux - WSL2 Ubuntu 20.04 没有 Docker 容器的输出

docker - 镜像和存储库有什么区别?

java - JaxWsDynamicClientfactory + java.lang.RuntimeException : Cannot create a secure XMLInputFactory

java - 你如何在 Spring 更改Docker容器TZ?

postgresql - Docker-compose:应用程序无法连接到 Postgres 容器

java.lang.NoClassDefFoundError : javax/validation/Validator

java - 使用与用于运行 maven 的版本不同的 Java 版本运行 maven