我正在使用包含所有 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.xml
和 settings.prod.xml
你设置MVN_SETTINGS
至settings.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/