簡體   English   中英

無法使用docker鏡像中的sh文件執行maven命令

[英]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.xmlsettings.prod.xml並且您將MVN_SETTINGS settings.prod.xmlsettings.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM