我基于 alpine Linex 的 docker 映像无法从网络获取任何内容。所以命令“apk add xxx”是有效的。现在我的想法是下载 .apk 文件并将其复制到 docker 容器中。但是如何安装 .apk 文件?
3 回答
假设您正在尝试在 Alpine 中安装 glibc
将包下载到当前目录
wget "https://circle-artifacts.com/gh/andyshinn/alpine-pkg-glibc/6/artifacts/0/home/ubuntu/alpine-pkg-glibc/packages/x86_64/glibc-2.21-r2.apk"
wget "https://circle-artifacts.com/gh/andyshinn/alpine-pkg-glibc/6/artifacts/0/home/ubuntu/alpine-pkg-glibc/packages/x86_64/glibc-bin-2.21-r2.apk"
然后,使用带有 --allow-untrusted 标志的 apk
apk add --allow-untrusted glibc-2.21-r2.apk glibc-bin-2.21-r2.apk
并完成安装(仅在本例中需要)
/usr/glibc/usr/bin/ldconfig /lib /usr/glibc/usr/lib
接下来的步骤对我来说很好:
获取“在线”Alpine 机器并下载软件包。示例是“zip”和“rsync”包:
- 更新您的系统:
sudo apk update
- 仅下载此软件包:
apk fetch zip rsync
- 更新您的系统:
您将获得这些文件(或者可能是实际版本):
zip-3.0-r8.apk
rsync-3.1.3-r3.apk
将此文件上传到“离线”Alpine 机器。
安装apk包:
sudo apk add --allow-untrusted zip-3.0-r8.apk sudo apk add --allow-untrusted rsync-3.1.3-r3.apk
更多信息:https ://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management
如果可以从连接到公共 Internet 的系统运行 Docker 命令,则可以通过将映像分成两部分以 Docker 原生方式执行此操作。
第一个图像仅包含apk
命令,但没有实际的应用程序代码。
FROM alpine
RUN apk add ...
构建该图像docker build -t me/alpine-base
,连接到网络。
您现在需要将该图像传输到隔离环境中。如果可以将某个系统连接到两个网络,并在环境中运行 Docker 注册表,那么您可以使用docker push
将映像发送到隔离环境。否则,这是您需要的少数情况之一docker save
:创建映像的 tar 文件,将该文件移动到隔离环境中(通过堡垒主机,在 USB 密钥上,...),然后docker load
在目标系统上.
现在您在目标系统上拥有该基础映像,因此您可以在其之上安装应用程序,而无需调用apk
.
FROM me/alpine-base
WORKDIR /app
COPY . .
CMD ...
这种方法适用于任何类型的工件。如果你有类似应用程序的package.json
///列出了应用程序的所有库依赖项requirements.txt
,你可以像这样提前运行下载Gemfile
和go.mod
安装步骤,但你需要记住重复它并手动移动如果这些依赖关系发生变化,则更新基础映像。