我有一個(多階段)alpine builder 映像,它安裝了一些 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-client pkg)。當腳本運行時,我們得到/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]
我的印象是,構建一個從帶有安裝的 apk 包的影像 B 擴展的影像 A 會給出一個帶有安裝在影像 B 中的包的影像 A。但似乎已安裝的包甚至沒有在同一個階段的多個階段之間共享Docker 檔案?
將這些包復制到最終影像 A 的正確方法是什么?
附言。影像需要分開,因為我需要在不同時間構建它們,因此單個多階段構建沒有用
uj5u.com熱心網友回復:
Dockerfile 中的第二FROM條陳述句將映像完全重置為新的基礎映像。沒有任何東西被結轉。從早期階段獲得某些東西的唯一方法是COPY --from=...宣告。
如果您在最終映像中需要一些軟體包,您應該在最終映像中安裝它們。從早期階段復制它們會很困難,因為您需要知道軟體包安裝了哪些檔案。
alpine在您的情況下,您應該在映像中安裝軟體包。然后它們也將在您制作的最終影像中可用,您基于 alpine 影像。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/468845.html
