我有一个我想要打包的Java服务,最终的docker镜像需要的唯一东西是JAR文件和配置文件.但是,我需要首先运行我的gradle命令来构建JAR,但我不希望所有使用的东西gradle都在结果docker镜像中.
这是我目前的DockerFile:
RUN apt-get update && apt-get install -y openjdk-7-jdk
COPY . /
RUN ./gradlew shadowJar
CMD ["java", "-jar", "service/build/libs/service.jar", "server", "service/service.yml"]
Run Code Online (Sandbox Code Playgroud)
你可以看到我必须COPY先把所有东西都放到一边这样才能运行./gradlew(否则就说命令无法找到).但最后,我需要的只是service.jar和service.yml文件.
我可能遗漏了一些东西,但是如何在./gradlew构建步骤中使所有内容可用,但只有结果图像包含service.jar和service.yml.
Docker引入了所谓的" 多阶段构建 ".使用它们,您可以避免在图像中包含不必要的文件.你Dockerfile会看起来像这样:
FROM ubuntu AS build
COPY . /src
# run your build
FROM ubuntu
RUN mkdir -p /dist/
COPY --from=build /src/my.object /dist/
Run Code Online (Sandbox Code Playgroud)
原理很简单.在第一个FROM你命名您的构建.在第二个中,FROM您可以使用COPY --from=-parameter将文件从第一个版本复制到第二个版本.第二个版本是稍后产生可用图像的版本.
有关更多信息,请访问:https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds
另一种解决方法是使用网络服务器来提取数据。
启动网络服务器,为您临时需要的文件提供服务。您可以使用
python3 -m http.server 8000 --bind 127.0.0.1 &
Run Code Online (Sandbox Code Playgroud)
要提供当前目录,请参阅https://docs.python.org/3/library/http.server.html#http-server-cli
在您Dockerfile获取文件、执行操作、删除文件的过程中RUN
RUN wget http://localhost:8000/big.tar && tar xf big.tar && ... && rm big.tar
Run Code Online (Sandbox Code Playgroud)构建镜像以便--network host能够访问localhost
构建图像的工作如下。
... docker build 命令将使用任何包含 Dockerfile 的目录作为构建上下文(包括其所有子目录)。构建上下文将在构建映像之前发送到 Docker 守护程序,这意味着如果您使用 / 作为源存储库,则硬盘驱动器的全部内容将被发送到守护程序...
请参阅https://docs.docker.com/reference/builder/
我看不出有什么办法可以实现你想要的。有两种选择:
在镜像中包含所有构建依赖项,并在容器内构建 JAR 文件。那会膨胀你的形象。
我建议单独构建您的 JAR,ADD并且在构建时只构建可执行文件和配置文件。这意味着所有构建依赖项都必须在您的开发环境中可用,但您的映像要尽可能小。
| 归档时间: |
|
| 查看次数: |
6552 次 |
| 最近记录: |