为什么我想知道这个:
目前,我使用 apt-get source 来获取基于 Debian 的 docker 镜像中所有软件包的源代码,以便在分发 docker 镜像时遵守 GPL。
现在有几个 docker 镜像,我想使用基于 alpine 的 docker 镜像,但我不知道如何获取用于在这些 docker 镜像中构建包的源代码。
到目前为止我发现了什么:
如果 alpine linux 有一个等效的 apt-get 源代码,这将不是问题(文档没有提到 apk 的源选项)
这Github页面仅包含脚本和补丁,但不包含确切的源代码,但构建脚本似乎只是从上游获取源代码。
他们必须在某个地方提供源代码,因为他们肯定会在 docker 镜像中分发一些 GPL 许可的二进制文件。
如何(准确地)获取用于构建 alpine docker 镜像包的源代码?
答案1
Alpines 包管理器APK
没有与dpkg
source 命令 ( apt-get source <PACKAGE_NAME>
) 等效的命令。
apk
要获取与 alpine linux 上已安装的软件包匹配的确切源代码,您可以使用和alpine-sdk
命令的组合。
在 alpine linux 上获取已安装软件包的确切源代码的步骤:
获取所有已安装软件包的列表:
apk info
安装 alpine-sdk(了解更多信息阅读高山维基):
apk --update add alpine-sdk
从 aports 克隆当前的 alpine 版本:
git clone --depth 1 --branch v3.13.1 git://git.alpinelinux.org/aports
循环安装的软件包并在 aports 文件夹中找到正确的文件夹(注意您可以获得的软件包版本
apk version <PACKAGE_NAME>
等于<PACKAGE_NAME>-<PACKAGE_BUILD_VERSION>-<PACKGAE_RELEASE_VERSION>
)。获取包源代码(包括alpine特定补丁文件和配置文件)
(可选)您可以为源文件设置自定义目标,
export SRCDEST="/path/to/my/custom/src/destination"
否则将在当前包文件夹中创建 src 文件夹在与包名称匹配的文件夹中(例如,
aports/main/git
对于git
包)abuild -F fetch verify
以 root 或abuild fetch verify
普通用户身份运行(这将获取脚本中引用的源文件APKBUILD
)包含 GPL 许可代码的软件包:为了遵守,
GPL
您必须提供获取的源文件和APKBUILD
脚本本身。您还必须提供脚本变量APKBUILD
中列出的包的源文件和脚本(大多数情况下,这些包是运行时依赖项的子包(参见第 6 点),例如)makedepends
APKBUILD
openssl-dev
openssl
这个问题关于GPL
并构建依赖关系。
并非每个包在 aports 中都有自己的文件夹,因为有时列出的包
apk info
将是另一个包的子包。在这种情况下,您必须获取文件中 origin 变量引用的包的源代码
.PKGINFO
,您可以使用apk fetch <sub-packagename>
命令获取该源代码。