Docker、Maven 和 settings.xml

sl3*_*dg3 9 configuration maven-3 docker

鉴于以下简单的 Dockerfile

FROM maven:3.6.3-ibmjava-8-alpine 

# Copy maven settings
COPY settings.xml /usr/share/maven/ref/
COPY pom.xml .

# WHY IS settings.xml HERE NOT CONSIDERED?
ENTRYPOINT ["mvn -X"]

# WHY IS settings.xml HERE NOT CONSIDERED?
#OR: RUN mvn clean install deploy
Run Code Online (Sandbox Code Playgroud)

我将maven 的 docker docsettings.xml中的建议复制到图像中。现在,当我运行容器时,这将失败: 正如我们在这里看到的,maven 尝试从默认的 maven 存储库中解决问题 - 尽管我在设置文件中定义了自己的 Maven 存储库。Could not find artifact com.my.artefactory:my-parent:pom:2.0.2 in central (https://repo.maven.apache.org/maven2)

当我删除ENTRYPOINT ["mvn -X"]并连接到容器docker run --rm -it mvn-builder sh,然后mvn -X在 shell 中手动运行时,它确实有效!还有预期的输出

[DEBUG] Using mirror my-mirror (https://com.my.artefactory/repository/whatever-repo/) for central (http://central).

我在这里想念什么?

sl3*_*dg3 12

我认为问题实际上是我派生的图像maven:3.6.3-ibmjava-8-alpine已经定义了一个ENTRYPOINT.

当我运行docker run -it --rm my-image-mvn mvn clean install deploy它时,它运行良好 - 对我来说已经足够了......

编辑 但我仍然想知道,为什么这不适用于 ENTRYPOINT(或 RUN)?

编辑 2 好的,我终于明白了,希望它能帮助别人。maven 的图像使用ENTRYPOINT带有 shell 脚本的 ,这将确保将settings.xml其放置到正确的目录中。这仅在您启动容器实例时发生。
为了使其真正适用于例如RUN命令,您必须自己做一些工作。

下面是一个例子:

FROM maven:3.6.3-ibmjava-8-alpine AS maven-builder

# Since we want to execute the mvn command with RUN (and not when the container gets started),
# we have to do here some manual setup which would be made by the maven's entrypoint script
RUN mkdir -p /root/.m2 \
    && mkdir /root/.m2/repository
# Copy maven settings, containing repository configurations
COPY settings.xml /root/.m2

...

RUN mvn clean install
Run Code Online (Sandbox Code Playgroud)

  • 您还可以指定与 `--settings` (或 `-s`)参数一起使用的 settings.xml: `COPY settings.xml /usr/share/maven/ref/` `RUN mvn --settings /usr/ share/maven/ref/settings.xml 全新安装` (6认同)