首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用安装在其他映像的构建器映像中的apk包。

使用安装在其他映像的构建器映像中的apk包。
EN

Stack Overflow用户
提问于 2022-04-28 22:53:19
回答 1查看 980关注 0票数 0

我有一个(多阶段)高山建设者映像,安装了几个apk包(postgres)和一个Go应用程序。然后,我有另一个映像,它是从这个映像扩展而来的,它需要使用安装在其中的apk包。然而,似乎apk包并没有出现在最终的图像中。我构建了构建器映像并运行它,并且apk包也没有安装在其中.

建造者:

代码语言:javascript
复制
FROM golang:1.18-alpine AS base
RUN apk add --no-cache --quiet musl-dev git gcc upx postgresql-client

RUN LDFLAGS="-s -w -linkmode external -extldflags \"-static\"" &&\
    go install --ldflags "$LDFLAGS" github.com/GoogleCloudPlatform/cloudsql-proxy/cmd/cloud_sql_proxy@latest &&\
    upx /go/bin/cloud_sql_proxy

# Build the dist image
FROM alpine
COPY --from=base /go/bin/cloud_sql_proxy /

最后图像:

代码语言:javascript
复制
# syntax=docker/dockerfile:experimental

# set default PSQLCONNECTOR_VERSION value
ARG PSQLCONNECTOR_VERSION=20220425

# pull from base image
FROM gcr.io/mycrepo/psql-cloudproxy-connector:$PSQLCONNECTOR_VERSION-alpine AS base

# copy script
COPY ./some_script.sh /

# make the script executable
RUN ["chmod", "+x", "/some_script.sh"]

some_script.sh包含:

代码语言:javascript
复制
PG_URL="postgresql://postgres:password@localhost:5432/some_db?sslmode=disable"
psql "$PG_URL" -c "SELECT * FROM ...;"

psql (来自postgresql)不存在于第二个映像中。当脚本运行时,我们得到/some_script.sh: line 35: psql: not found

下面是最后一个容器中apk list的输出:

代码语言:javascript
复制
apk list
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/main: No such file or directory
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/community: No such file or directory
libretls-3.3.4-r3 x86_64 {libretls} (ISC AND (BSD-3-Clause OR MIT)) [installed]
musl-1.2.2-r7 x86_64 {musl} (MIT) [installed]
zlib-1.2.12-r0 x86_64 {zlib} (Zlib) [installed]
apk-tools-2.12.7-r3 x86_64 {apk-tools} (GPL-2.0-only) [installed]
musl-utils-1.2.2-r7 x86_64 {musl} (MIT BSD GPL2+) [installed]
libssl1.1-1.1.1n-r0 x86_64 {openssl} (OpenSSL) [installed]
alpine-baselayout-3.2.0-r18 x86_64 {alpine-baselayout} (GPL-2.0-only) [installed]
alpine-keys-2.4-r1 x86_64 {alpine-keys} (MIT) [installed]
busybox-1.34.1-r5 x86_64 {busybox} (GPL-2.0-only) [installed]
scanelf-1.3.3-r0 x86_64 {pax-utils} (GPL-2.0-only) [installed]
ca-certificates-bundle-20211220-r0 x86_64 {ca-certificates} (MPL-2.0 AND MIT) [installed]
libc-utils-0.7.2-r3 x86_64 {libc-dev} (BSD-2-Clause AND BSD-3-Clause) [installed]
ssl_client-1.34.1-r5 x86_64 {busybox} (GPL-2.0-only) [installed]
libcrypto1.1-1.1.1n-r0 x86_64 {openssl} (OpenSSL) [installed]

我当时的印象是,构建一个从图像B扩展到已安装apk包的映像A,会给出一个图像A,其中的包安装在图像B中。但是,似乎在同一个Dockerfile中的多个阶段之间,安装的包甚至没有共享?

将这些包复制到最终图像A的正确方法是什么?

ps。图像需要分开,因为我需要在不同的时间构建它们,所以一个多阶段的构建是没有用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-28 23:46:42

Dockerfile中的第二个FROM语句完全将图像重置为新的基本映像。什么都不结转。从早期阶段获得某些信息的唯一方法是COPY --from=...语句。

如果您在最终映像中需要一些包,则应该在最终映像中安装它们。从早期阶段复制它们是很困难的,因为您需要知道包安装了哪些文件。

在您的示例中,您应该在alpine映像中安装这些包。然后,它们也将在最后的图像中可用,这是基于高寒图像的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72051041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档