如何使用多阶段 docker 镜像将 libnss3.so 从一个镜像复制到另一个镜像

时间:2021-05-25 10:35:02

标签: docker dockerfile

我需要使用“gcr.oi/distroless/java:8”图像来保持我的图像轻量级。但是,当我运行程序时,出现错误:“由 FileNotFoundException 引起:/usr/lib/x86_64_linux_gnu/linbnss3.so”和“无法初始化 NSS”异常。因为,我必须使用这个图像,我想从另一个图像“FROM openjdk:8-jre-stretch”复制这个丢失的文件/依赖项。请建议如何复制此依赖项。

1 个答案:

答案 0 :(得分:0)

这个问题本身描述的不是很详细,所以这里我不能给出具体的答案,或者详细说明你哪里出错了。但我可以根据 Docker documentation 中介绍的示例为您提供一个示例。

# syntax=docker/dockerfile:1
FROM gcr.oi/distroless/java:8
COPY --from=openjdk:8-jre-stretch /location/of/the/file/in/image /your/target/location
# After that, do your own stuff

COPY --from 告诉 Dockerfile 从其他镜像复制文件。如果镜像存在于 DockerHub 中,它将从那里拉取以启用副本。如果镜像在 DockerHub 中不存在,那么你必须在本地拥有它。

如果您在实施我在此处提供的示例时遇到任何问题,请告诉我。

如果没有额外步骤的文件不存在于图像中,那么您可以使用多阶段构建。例如

# syntax=docker/dockerfile:1
FROM openjdk:8-jre-stretch as builder
# execute some logic that you need to create the file
FROM gcr.oi/distroless/java:8
COPY --from=builder /location/of/the/file/in/image /your/target/location
# After that, do your own stuff

代码

<块引用>

从 openjdk:8-jre-stretch 作为构建器

开始构建一个中间映像,您可以稍后使用名称“builder”引用该映像。