如何使用快照构建确定docker入口点?

时间:2015-12-15 20:17:20

标签: java gradle docker

如果这是一个重复的问题,请提前抱歉。它可能是,但我找不到我想要的东西。

我们有一个CI管道,它使用gradle来构建我们的Java项目,我们需要对它进行dockerize。作为管道的一部分,软件版本不断更新。因此,当我们将tar文件复制(或添加)到docker镜像时,它需要一个通配符搜索,我可以这样做。但是,由于gradle如何构建tar文件,入口点还需要一个软件版本。在构建我的docker镜像时,我无法弄清楚如何在运行时生成入口点。

由于这可能没有多大意义,这是我当前的dockerfile:

# This is the base image
FROM internal_server/java8

# location of the working directories
VOLUME /tmp

# Add the gradle distribution to the container and untar it
# The actual name of the tar file will be of the form 
# package-version-snapshot.tar
COPY build/distributions/package-*.tar package.tar
RUN tar xvf package.tar

# This is a gradle convention, the script that runs the program,
# in our case, will have the same name as the tar file
ENTRYPOINT ["package/bin/package"]

请注意,在复制命令中,我使用了通配符搜索。这给了我tar文件,而忽略了版本号。如何使用入口点执行相同的操作?或者,或者,如何以dockerfile的其余部分可以使用的形式导出文件名?

我可以通过做

这样的事情来获得完整的路径
RUN export FILE_NAME=`find ./ -name rmob-boundaries -type f`

但是我无法识别它。做点什么

RUN echo $FILE_NAME

ENTRYPOINT ["$FILE_NAME"]

不起作用。

感谢任何帮助,谢谢!

编辑1:尝试了第一条评论。做点什么

RUN export FILE_NAME=`find ./ -name package -type f`

ENTRYPOINT $FILE_NAME

不起作用。 docker镜像构建,但docker只运行...没有做任何事情。我认为因为变量FILE_NAME未定义,当它作为shell运行时,它只是尝试执行一个不存在的命令而失败。

编辑2:以下是我认为问题的实质所在。假设我执行以下命令:

RUN export FILE_NAME=`find ./ -name package -type f`; echo $FILE_NAME
RUN echo $FILE_NAME

第一行,运行命令集成功导出变量并将其打印到std out,但在第二个运行命令中,它没有打印出任何内容。因此,即使我已经导出了正确的值,它也必须在子shell中执行(有点猜测),因为任何其他RUN方法都无法看到该值。在这种情况下,无论我如何实现,入口点都会失败。

但是,如果我执行以下操作:

ENV FILE_NAME `find ./ -name package -type f`
RUN echo $FILE_NAME

变量中保存的是实际的文本字符串,而不是像在bash中所期望的那样对它进行评估。回声确实有效,但打印出来的是find ./ -name package -type f作为变量的值。此外,在这种情况下,当我尝试运行程序时,入口点也会失败。

0 个答案:

没有答案