java - 使用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]
解决方案
首先,您不能通过使用多FROM
行一个接一个地组合两个 Docker 映像。甚至可以指定多个的原因是启用多阶段构建。
其次,如果您不使用此行:
RUN mvn -B -f ./pom.xml -s settings.xml dependency:resolve
你也可以评论这个:
COPY pom.xml /usr/src/app
因为您的 POM 将与其余的源代码一起复制。
第三,从你的 Dockerfile 来看,你settings.xml
的工作目录中有几个文件,你想根据构建参数选择一个。但是,如果您说settings.xml
andsettings.prod.xml
并且设置MVN_SETTINGS
为settings.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
推荐阅读
- python - 是否有更快的 Numpy 函数来执行 add.at,但有两组索引?
- javascript - 使页面滚动以将 div 放在顶部
- docker - 升级到 7.4.1 后的 Artifactory Docker 404
- apache-kafka - Kafka 分区的大小和写入没有可用磁盘空间的主题
- javascript - Chrome 扩展 javascript 注入
- javafx - JavaFX 中心文本
- python - 为什么 multiprocessing 运行,CPU 使用率下降到 0%,但结果从未发布?
- api - PagerDuty 分页
- amazon-web-services - 将多个子网分配给路由表 aws
- jupyter-notebook - 无法连接到 jupyter localhost