Our Nexus服务器 http://www.sonatype.com/nexus/product-overview为我们的 Java 项目提供构建工件,包括其安装程序。那个安装程序是真的很大(>1GB)。我想检索并使用它Dockerfile
.
到目前为止我所做的如下:
FROM debian:jessie
...
RUN apt-get install -y curl xmllib-xpath-perl
ENV PROJECT_VERSION x.y.z-SNAPSHOT
...
RUN VERSION=`curl --silent "http://nexus:8081/service/local/artifact/maven/resolve?r=public&g=my.group.id&a=installer&v=${PROJECT_VERSION}&e=sh&c=linux64" | xpath -q -s '' -e '//data/version/text()'` \
&& echo Version:\'${VERSION}\' \
&& curl --silent http://nexus/content/groups/public/my/group/id/installer/${PROJECT_VERSION}/installer-${VERSION}-linux64.sh \
--create-dirs \
--output ${INSTALL_DIR}/installer.sh \
&& sh ${INSTALL_DIR}/installer.sh <someArgs> \
&& rm ${INSTALL_DIR}/installer.sh
...
通过这种方法,我能够:
- 查询 Nexus 以提供所提供的最新 SNAPSHOT 版本
${PROJECT_VERSION}
期间注销的docker build
- 使用该版本下载相应的安装程序二进制文件
- 执行安装程序二进制文件
- 执行后立即删除安装程序二进制文件不将其存储在创建的 Docker 镜像层中
缺什么:
- 每当新的安装程序部署到 Nexus 时,我都必须使用以下命令构建 Docker 映像
docker build --no-cache
。否则 Docker 无法使其缓存失效并为同时部署到 Nexus 的较新安装程序重新运行安装步骤。
所以我尝试了一种不同的方法ADD
声明,因为那些有缓存能力根据文档。但这不起作用,因为我需要向ADD
由上一步查询 Nexus 以获得正确的 SNAPSHOT 版本设置的语句:
FROM debian:jessie
...
RUN apt-get install -y curl xmllib-xpath-perl
ENV PROJECT_VERSION x.y.z-SNAPSHOT
...
ADD http://nexus:8081/service/local/artifact/maven/resolve?r=public&g=my.group.id&a=installer&v=${PROJECT_VERSION}&e=sh&c=linux64 ${INSTALL_DIR}/version.xml
RUN cat ${INSTALL_DIR}/version.xml | xpath -q -s '' -e '//data/version/text()' > ${INSTALL_DIR}/version.txt
# FIXME: Somehow do a `cat ${INSTALL_DIR}/version.txt to set the ENV ${VERSION} variable ?!
ADD http://nexus/content/groups/public/my/group/id/installer/${PROJECT_VERSION}/installer-${VERSION}-linux64.sh ${INSTALL_DIR}/installer.sh
RUN ${INSTALL_DIR}/installer.sh <someArgs> && rm ${INSTALL_DIR}/installer.sh
...
这种方法行不通,因为:
- 无法设置
${VERSION}
内的环境变量Dockerfile
到存储在的版本version.txt
file.
- 无法阻止将安装程序存储在映像层中。
但至少这会使用适当的缓存来重新使用旧安装程序版本的现有映像层,并在 Nexus 上部署新安装程序版本时创建新映像层。
所以问题是:如何同时启用正确的缓存、缓存失效以及从 Docker 映像层中排除大安装程序文件?
EDIT:我找到了一种通过使用其他 Nexus API 使图像层缓存正常工作的方法:
FROM debian:jessie
...
ENV PROJECT_VERSION x.y.z-SNAPSHOT
...
ADD http://nexus:8081/service/local/artifact/maven/content?r=public&g=my.group.id&a=installer&v=${PROJECT_VERSION}&e=sh&c=linux64 ${INSTALL_DIR}/installer.sh
RUN sh ${INSTALL_DIR}/installer.sh <someArgs> \
&& rm ${INSTALL_DIR}/installer.sh
...
但仍然是镜像层中包含非常大的安装程序文件的问题仍然存在因为在该代码中剪掉了ADD
使用机制。
有关如何从缓存及其正确失效中受益的任何想法ADD
声明但同时不将添加的文件包含到图像历史记录中?