gpt4 book ai didi

docker - 是否可以在Docker的一个构建步骤中添加安装程序,运行它并删除它?

转载 作者:行者123 更新时间:2023-12-02 19:24:17 25 4
gpt4 key购买 nike

我正在尝试从相当大的安装程序二进制文件(300+ MB)创建Docker镜像。我想将安装程序添加到镜像中,进行安装,然后删除安装程序。这似乎不可能:

COPY huge-installer.bin /tmp
RUN /tmp/huge-installer.bin
RUN rm /tmp/huge-installer.bin # <- has no effect on the image size

使用多个构建阶段似乎无法解决此问题,因为我需要在最终镜像中运行安装程序。如果我可以直接从上一个构建阶段执行安装程序而不复制它,那将解决我的问题,但据我所知这是不可能的。

有什么方法可以避免在最终镜像中包含安装程序的全部重量?

最佳答案

我最终通过使用Python中的内置HTTP服务器来解决此问题,从而使项目目录可通过HTTP用于图像。

在Dockerfile内,我可以运行以下命令,使用curl直接将脚本传递到bash:

RUN curl "http://127.0.0.1:${SERVER_PORT}/installer-${INSTALLER_VERSION}.bin" | bash

或保存二进制文件,运行它们并一步将其删除:
RUN curl -O "http://127.0.0.1:${SERVER_PORT}/binary-${INSTALLER_VERSION}.bin" && \
./binary-${INSTALLER_VERSION}.bin && \
rm binary-${INSTALLER_VERSION}.bin

我使用Makefile来启动服务器,并在构建后将其停止,但是您可以改用构建脚本。

这是一个Makefile示例:
SHELL := bash
IMAGE_NAME := app-test
VERSION := 1.0.0
SERVER_PORT := 8580

.ONESHELL:

.PHONY: build
build:
# Kills the HTTP server when the build is done
function cleanup {
pkill -f "python3 -m http.server.*${SERVER_PORT}"
}
trap cleanup EXIT

# Starts a HTTP server that makes the contents of the project directory
# available to the image
python3 -m http.server -b 127.0.0.1 ${SERVER_PORT} &>/dev/null &
sleep 1

EXTRA_ARGS=""

# Allows skipping the build cache by setting NO_CACHE=1
if [[ -n $$NO_CACHE ]]; then
EXTRA_ARGS="--no-cache"
fi

docker build $$EXTRA_ARGS \
--network host \
--build-arg SERVER_PORT=${SERVER_PORT} \
-t ${IMAGE_NAME}:latest \
.

docker tag ${IMAGE_NAME}:latest ${IMAGE_NAME}:${VERSION}

关于docker - 是否可以在Docker的一个构建步骤中添加安装程序,运行它并删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57523611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com