我有一个(多阶段)高山建设者映像,安装了几个apk包(postgres)和一个Go应用程序。然后,我有另一个映像,它是从这个映像扩展而来的,它需要使用安装在其中的apk包。然而,似乎apk包并没有出现在最终的图像中。我构建了构建器映像并运行它,并且apk包也没有安装在其中.
建造者:
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 /最后图像:
# 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包含:
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的输出:
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。图像需要分开,因为我需要在不同的时间构建它们,所以一个多阶段的构建是没有用的。
发布于 2022-04-28 23:46:42
Dockerfile中的第二个FROM语句完全将图像重置为新的基本映像。什么都不结转。从早期阶段获得某些信息的唯一方法是COPY --from=...语句。
如果您在最终映像中需要一些包,则应该在最终映像中安装它们。从早期阶段复制它们是很困难的,因为您需要知道包安装了哪些文件。
在您的示例中,您应该在alpine映像中安装这些包。然后,它们也将在最后的图像中可用,这是基于高寒图像的。
https://stackoverflow.com/questions/72051041
复制相似问题