apk-packager is a Docker image with an accompanying script to automate building and packaging apk packages via abuild for any architecture from any architecture.
Download the script.
wget https://raw.githubusercontent.com/hydazz/docker-apk-packager/main/build.shAllow the file to be executed.
chmod +x build.shRun the script (example, see below).
./build.sh -v latest -a <arch> -k <key> -i <input> -o <output>The docker container can also be ran standalone, without the script
docker run -it --rm -v <input>:/config/apk-build -v <output>:/out -e testing=true hydaz/apk-packager<input> is the directory the APKBUILD file resides in, not the APKBUILD file
| Name | Description | Example |
|---|---|---|
-v |
(Optional) The Alpine version that will be used when building the package. Defaults to latest. See supported Alpine versions. |
-v latest |
-a |
(Optional) The architecture that the builder will run on. Creating an apk file for that specific architecture. Defaults to what architecture your system is. See supported architectures. | -a amd64 |
-k |
(Optional)* Path to your private key generated by abuild-keygen. This path must be absolute! | -k /path/to/key.rsa |
-i |
(Required) The location of the APKBUILD file. | -i /path/to/package or -i /path/to/package/APKBUILD |
-o |
(Required) The folder the .apk files will be saved to. | -o /output/directory |
-t |
(Optional) Append to enable the testing repository. | -t |
*If no private key is specified, one will be generated in the output directory.
Putting these all together in a command:
./build.sh -v latest -a amd64 -k /path/to/key.rsa -i /path/to/package -o /output/directory -tIf the build was successful, you should see Build successful! in the terminal. If you do not see this message, check the terminal for errors.
I have not incorporated an easy way to do this in the scripts, but running the commands separately doesn't hurt. Here's an example of building for all supported architectures.
#!/bin/bash
for arch in amd64 arm/v6 arm/v7 arm64 i386 ppc64le s390x; do
./build.sh -a $arch -k <key> -i <input> -o <output>
doneThis will create the apk-packager folder in the <output> directory. Depending on what architectures you used, the folder will have separate subfolders for each architecture.
This is a big no-no, the APKINDEX.tar.gz file will be overwritten, and everything will just become a mess. To get past this hurdle extract the APKINDEX.tar.gz archive. There will be an APKINDEX text file within the archive. Move this file somewhere safe and delete the APKINDEX.tar.gz archive from the directory. Then you can run the build command. Once the build command is done, follow these steps:
- Extract the newer
APKINDEX.tar.gz(make sure its the new one, the only one should be deleted but whatever) - Open the newer
APKINDEXfile that was extracted from the newerAPKINDEX.tar.gz - Copy the contents of the old
APKINDEXfile and paste them at the bottom of the new one. make sure there is one space between the packages
Below is ran within an Alpine container.
- On a fresh Alpine Docker container, mount the
apk-packagerfolder within the container and runapk add alpine-sdk cdto the folder containing the modifiedAPKINDEXfile- run
tar -c APKINDEX | abuild-tar --cut | gzip -9 >APKINDEX.tar.gzto make aAPKINDEX.tar.gzarchive from the file - Run
abuild-sign -k /path/to/private_key.rsa APKINDEX.tar.gzto sign the index
Follow these steps for every package and architecture; it does get tedious.
From my testing, building seems to work on any OS that supports Docker and QEMU.
| OS | Notes |
|---|---|
| Ubuntu/Debian | Requires some setting up, see here. |
| macOS (via Docker Desktop) | jq should be installed, see here |
Jq and Docker buildx is only required when building for architectures that are not the hosts.
macOS only requires Docker Desktop and jq to be installed for everything to work smoothly. Docker desktop can be downloaded from docker's website.
jq can be installed via brew:
brew install jqUbuntu/Debian doesn't have docker desktop, so setup is a little more complicated, qemu, jq, docker and docker buildx have to be installed.
Installing Docker:
curl -sSL https://get.docker.com | bashThe above command should automatically install docker and docker buildx if it did not install buildx (which can be validated by running docker buildx ls). Try manually installing as shown below.
Manually Installing Docker Buildx:
Docker Buildx is included in Docker Desktop and Docker Linux packages when installed using the DEB or RPM packages.
You can also download the latest buildx binary from the Docker buildx releases page on GitHub, copy it to ~/.docker/cli-plugins folder with name docker-buildx and change the permission to execute:
chmod a+x ~/.docker/cli-plugins/docker-buildxVerify Docker Buildx installation by running:
docker buildx lsSee here for more help installing docker buildx.
Installing jq:
apt-get install jqDocker Desktop comes with multi-arch support out of the box. If you are running on any other operating system than macOS or Windows that does not have docker desktop, you will need to install QEMU to achieve full multi-arch buildx,
apt-get install qemu-user-staticRun docker buildx ls. This will give you a list of architectures your system can emulate.
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
...
... linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
Currently, all architectures are supported on the latest Alpine versions. Feel free to open an issue if you need a specific Alpine version.
| Platform | Alpine versions, -v Input |
-a Input |
Name of output folder |
|---|---|---|---|
| linux/amd64 | edge, latest, 3.15 | amd64 |
x86_64 |
| linux/arm/v6 | edge, latest, 3.15 | arm/v6 |
armhf |
| linux/arm/v7 | edge, latest, 3.15 | arm/v7 |
armv7 |
| linux/arm64/v8 | edge, latest, 3.15 | arm64 |
aarch64 |
| linux/386 | edge, latest, 3.15 | 386 |
x86 |
| linux/ppc64le | edge, latest, 3.15 | ppc64le |
ppc64le |
| linux/s390x | edge, latest, 3.15 | s390x |
s390x |