Docker、maven 和 settings.xml
Docker, maven and settings.xml
给出以下简单的 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
我将 maven's docker doc 中建议的 settings.xml
复制到图像中。现在,当我 运行 容器时,这将失败:Could not find artifact com.my.artefactory:my-parent:pom:2.0.2 in central (https://repo.maven.apache.org/maven2)
正如我们在这里看到的,maven 尝试从默认的 maven 仓库中解决问题——尽管我在设置文件中定义了我自己的 maven 仓库。
当我删除 ENTRYPOINT ["mvn -X"]
并连接到容器 docker run --rm -it mvn-builder sh
,然后在 shell 中手动 运行 mvn -X
时,它确实有效!还有预期的输出
[DEBUG] Using mirror my-mirror (https://com.my.artefactory/repository/whatever-repo/) for central (http://central).
我在这里想念什么?
我认为问题实际上是我从 maven:3.6.3-ibmjava-8-alpine
派生的图像已经定义了 ENTRYPOINT
.
当我 运行 docker run -it --rm my-image-mvn mvn clean install deploy
它工作正常 - 对我来说足够好...
编辑
但我仍然想知道,为什么这不适用于 ENTRYPOINT(或 运行)?
编辑 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
给出以下简单的 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
我将 maven's docker doc 中建议的 settings.xml
复制到图像中。现在,当我 运行 容器时,这将失败:Could not find artifact com.my.artefactory:my-parent:pom:2.0.2 in central (https://repo.maven.apache.org/maven2)
正如我们在这里看到的,maven 尝试从默认的 maven 仓库中解决问题——尽管我在设置文件中定义了我自己的 maven 仓库。
当我删除 ENTRYPOINT ["mvn -X"]
并连接到容器 docker run --rm -it mvn-builder sh
,然后在 shell 中手动 运行 mvn -X
时,它确实有效!还有预期的输出
[DEBUG] Using mirror my-mirror (https://com.my.artefactory/repository/whatever-repo/) for central (http://central).
我在这里想念什么?
我认为问题实际上是我从 maven:3.6.3-ibmjava-8-alpine
派生的图像已经定义了 ENTRYPOINT
.
当我 运行 docker run -it --rm my-image-mvn mvn clean install deploy
它工作正常 - 对我来说足够好...
编辑 但我仍然想知道,为什么这不适用于 ENTRYPOINT(或 运行)?
编辑 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