Docker 이미지에서 사용할 패키지 관리자를 결정하는 방법

Docker 이미지에서 사용할 패키지 관리자를 결정하는 방법

하나 작성하려고 하는데 도커 이미지에 Dockerfile설치해야 합니다 . wget기본 이미지가 어떤 배포판을 사용하는지, 어떤 패키지 관리자를 사용할지 결정하는 방법을 잘 모르겠습니다. Dockerfile이제 저에게 실패의 예는 다음과 같습니다.

FROM openjdk:18-jdk
RUN apt-get update && apt-get install -y wget
#...

오류가 있습니다 #5 0.334 /bin/sh: apt-get: command not found. 내가 Dockerfile떠나면

FROM openjdk:18-jdk

그런 다음 bash 를 사용하여 빌드 docker build -t test:latest .하고 입력하면 다음을 docker run -it --rm --entrypoint "bash" test실행하여 배포판을 찾을 수 있습니다.

bash-4.4# cat /proc/version
Linux version 5.10.104-linuxkit (root@buildkitsandbox) (gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, GNU ld (GNU Binutils) 2.35.2) #1 SMP Thu Mar 17 17:08:06 UTC 2022

apk이로 인해 패키지 관리자 로 사용해야 하는 Alpine이 실행되고 있다고 생각됩니다 . 그러나 apk아직 설치되지 않은 것 같습니다.

bash-4.4# apk
bash: apk: command not found

그래서 제 질문은, 주어진 도커 기본 이미지가 어떤 패키지 관리자를 사용하는지 결정하는 방법이 있습니까?

답변1

/proc/version컨테이너가 아닌 실행 중인 커널을 설명하기 때문에 오해의 소지가 있습니다. openjdk:18-jdkOracle Linux Server 8.6을 기반으로 하는 최소 이미지입니다.

임의의 컨테이너 이미지가 주어지면 사용할 패키지 관리자를 결정하는 가장 좋은 방법은 이를 빌드하는 데 사용된 패키지 관리자를 결정하는 것입니다 docker history.예를 들어

$ docker history --no-trunc openjdk:18-jdk
ID                                                                CREATED     CREATED BY                                                                                                         SIZE               COMMENT
2ca1678559911c90c4eb850939b5c9cfbb1d9db3a0b18b25510e30ca6e5e85c4  6 days ago  /bin/sh -c #(nop)  CMD ["jshell"]                                                                                  0 B                
<missing>                                                         6 days ago  /bin/sh -c set -eux;                                                                                                                  arch="$(objdump="$(command -v objdump)" && objdump --file-headers "$objdump" | awk -F '[:,]+[[:space:]]+' '$1 == "architecture" { print $2 }')";   case "$arch" in               'i386:x86-64')                           downloadUrl='https://download.java.net/java/GA/jdk18.0.2.1/db379da656dc47308e138f21b33976fa/1/GPL/openjdk-18.0.2.1_linux-x64_bin.tar.gz';                           downloadSha256='3bfdb59fc38884672677cebca9a216902d87fe867563182ae8bc3373a65a2ebd';                           ;;                      'aarch64')                           downloadUrl='https://download.java.net/java/GA/jdk18.0.2.1/db379da656dc47308e138f21b33976fa/1/GPL/openjdk-18.0.2.1_linux-aarch64_bin.tar.gz';                           downloadSha256='79900237a5912045f8c9f1065b5204a474803cbbb4d075ab9620650fb75dfc1b';                           ;;                      *) echo >&2 "error: unsupported architecture: '$arch'"; exit 1 ;;   esac;                   curl -fL -o openjdk.tgz "$downloadUrl";   echo "$downloadSha256 *openjdk.tgz" | sha256sum --strict --check -;               mkdir -p "$JAVA_HOME";   tar --extract               --file openjdk.tgz               --directory "$JAVA_HOME"               --strip-components 1               --no-same-owner   ;           rm openjdk.tgz*;               rm -rf "$JAVA_HOME/lib/security/cacerts";   ln -sT /etc/pki/ca-trust/extracted/java/cacerts "$JAVA_HOME/lib/security/cacerts";               ln -sfT "$JAVA_HOME" /usr/java/default;   ln -sfT "$JAVA_HOME" /usr/java/latest;   for bin in "$JAVA_HOME/bin/"*; do               base="$(basename "$bin")";               [ ! -e "/usr/bin/$base" ];               alternatives --install "/usr/bin/$base" "$base" "$bin" 20000;   done;                   java -Xshare:dump;               fileEncoding="$(echo 'System.out.println(System.getProperty("file.encoding"))' | jshell -s -)"; [ "$fileEncoding" = 'UTF-8' ]; rm -rf ~/.java;   javac --version;   java --version  324 MB      
<missing>                                                         6 days ago  /bin/sh -c #(nop)  ENV JAVA_VERSION=18.0.2.1                                                                       0 B                
<missing>                                                         6 days ago  /bin/sh -c #(nop)  ENV LANG=C.UTF-8                                                                                0 B                
<missing>                                                         6 days ago  /bin/sh -c #(nop)  ENV PATH=/usr/java/openjdk-18/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  0 B                
<missing>                                                         6 days ago  /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/java/openjdk-18                                                              0 B                
<missing>                                                         6 days ago  /bin/sh -c set -eux;                                                                                               microdnf install               gzip                    tar                                             binutils                freetype fontconfig   ;           microdnf clean all  37 MB       
<missing>                                                         6 days ago  /bin/sh -c #(nop)  CMD ["/bin/bash"]                                                                               0 B                
<missing>                                                         6 days ago  /bin/sh -c #(nop) ADD file:94f0ad5f0805806df710f02659592b7a0ee14643d54d40f0dca144e16c2c69ec in /                   105 MB

여기에서 볼 수 있듯이 패키지는 microdnf다른 패키지를 설치할 때 사용해야 하는 를 사용하여 설치됩니다.

관련 정보