Package-Management
如何確定在 docker 映像中使用哪個包管理器
我正在嘗試編寫一個
Dockerfile
並且需要安裝wget
在 docker 映像中。我從不知道如何確定基礎映像使用哪個發行版,或者使用哪個包管理器。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
然後使用建構它
docker build -t test:latest .
,然後將其輸入到 bash 中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
這讓我認為它正在執行 Alpine,我認為應該
apk
用作包管理器。但是,它似乎apk
也沒有安裝:bash-4.4# apk bash: apk: command not found
所以我的問題是,有沒有辦法確定為給定的 docker 基礎映像使用哪個包管理器?
/proc/version
具有誤導性,因為它描述了正在執行的核心,而不是容器。openjdk:18-jdk
基於 Oracle 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
的,這就是您應該使用它來安裝其他軟體包。