[英]Unable to execute the maven command by using the sh file in docker image
我正在使用 sh 文件,其中包含所有 maven 配置、密鑰、maven 命令等,我想從 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
和settings.prod.xml
並且您將MVN_SETTINGS
settings.prod.xml
為settings.prod.xml
,那么/usr/src/app/settings.xml
將被這一行覆蓋:
COPY . /usr/src/app
使用settings.xml
。
第四, mvn clean install
運行測試,不需要單獨做mvn test
。
最后,對於你注意到的問題。 我不確定在運行映像時您期望發生什么,但是您沒有指定任何要在 Dockerfile 中運行的入口點或命令,因此您的映像從其基礎繼承了默認設置。 現在假設通過docker.io/library/maven:3.5.3-jdk-8
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
,假設您想在運行DockerTest.sh
時運行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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.