From 657ff2ec0e27eb645fabb2dc7638ba28a91de33f Mon Sep 17 00:00:00 2001 From: root Date: Mon, 6 Dec 2021 13:22:09 +0000 Subject: [PATCH] Initial commit --- .github/workflows/build.yaml | 57 +++++++ Dockerfile | 27 +++ LICENSE | 21 +++ README.md | 18 ++ pacman/keyrings/archlinuxarm-revoked | 0 pacman/keyrings/archlinuxarm-trusted | 3 + pacman/keyrings/archlinuxarm.gpg | 238 +++++++++++++++++++++++++++ pacman/pacstrap-docker | 31 ++++ pacman/repos | 14 ++ 9 files changed, 409 insertions(+) create mode 100644 .github/workflows/build.yaml create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 pacman/keyrings/archlinuxarm-revoked create mode 100644 pacman/keyrings/archlinuxarm-trusted create mode 100644 pacman/keyrings/archlinuxarm.gpg create mode 100755 pacman/pacstrap-docker create mode 100644 pacman/repos diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..658ee76 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,57 @@ +name: Build and Push + +on: + workflow_dispatch: + schedule: + - cron: '0 6 * * *' + +env: + IMAGE_NAME: menci/archlinuxarm + +jobs: + build: + strategy: + fail-fast: false + matrix: + target: + - tag: base + package-group: base + - tag: base-devel + package-group: base base-devel + name: ${{ matrix.target.tag }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Generate Tag List + run: | + echo "TAGS<> $GITHUB_ENV + + DATE="$(date +'%Y%m%d')" + echo $IMAGE_NAME:$TAG >> $GITHUB_ENV + echo $IMAGE_NAME:$TAG-$DATE.$RUN_ID >> $GITHUB_ENV + if [[ "$TAG" == "base" ]]; then + echo $IMAGE_NAME:latest >> $GITHUB_ENV + fi + + echo "EOF" >> $GITHUB_ENV + env: + TAG: ${{ matrix.target.tag }} + RUN_ID: ${{ github.run_id }} + - name: Build and Push + uses: docker/build-push-action@v2 + with: + platforms: linux/arm64 + push: true + tags: ${{ env.TAGS }} + build-args: | + PACKAGE_GROUP=${{ matrix.target.package-group }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8f1a919 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +ARG PACKAGE_GROUP=base + +FROM alpine:3.15 AS bootstrapper +COPY pacman /pacman +RUN \ + apk add arch-install-scripts pacman-makepkg && \ + cat /pacman/repos >> /etc/pacman.conf && \ + cp -r /pacman/keyrings /usr/share/pacman/ && \ + pacman-key --init && \ + pacman-key --populate && \ + mkdir /rootfs && \ + /pacman/pacstrap-docker /rootfs $PACKAGE_GROUP && \ + echo "en_US.UTF-8 UTF-8" > /rootfs/etc/locale.gen && \ + echo "LANG=en_US.UTF-8" > /rootfs/etc/locale.conf && \ + chroot /rootfs locale-gen && \ + rm -rf /rootfs/var/lib/pacman/sync/* /root/pacman + +FROM scratch +COPY --from=bootstrapper /rootfs/ / +ENV LANG=en_US.UTF-8 +RUN \ + ln -sf /usr/lib/os-release /etc/os-release && \ + pacman-key --init && \ + pacman-key --populate && \ + rm -rf /etc/pacman.d/gnupg/{openpgp-revocs.d/,private-keys-v1.d/,pubring.gpg~,gnupg.S.}* + +CMD ["/usr/bin/bash"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..59e2f32 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Menci + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..41bf31a --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Docker Image for Arch Linux ARM + +[![Build and Push](https://github.com/Menci/docker-archlinuxarm/actions/workflows/build.yaml/badge.svg)](https://github.com/Menci/docker-archlinuxarm/actions/workflows/build.yaml) + +This is the Docker image for Arch Linux ARM. All images are built on GitHub Actions automatically. + +Just just like the official Arch Linux amd64 image, it has two tags: + +* `base` (default): installed only the package group `base`. +* `base-devel`: installed the package group `base-devel`. + +And, the pamcan lsign-key is also removed for [security reasons](https://gitlab.archlinux.org/archlinux/archlinux-docker/-/blob/bc4d9f8ec5bdcbedefc96a2a1beaf33f01c07812/README.md#principles). + +# Under the Hood + +The Dockerfile uses a Alpine Linux container to install `pacman` and bootstrap the Arch Linux ARM rootfs. Since `pacstrap` uses `mount`, it doesn't run in an unprivileged Docker container. I found the tool [`pacstrap-docker`](https://github.com/lopsided98/archlinux-docker/blob/d5a80b90aea37eee43bcc7efeaea69880a4aada7/pacstrap-docker) ([LICENSE](https://github.com/lopsided98/archlinux-docker/blob/d5a80b90aea37eee43bcc7efeaea69880a4aada7/LICENSE)) as a replacement. + +After bootstrapping, the rootfs will be copied to a new container from `scratch` (aka. an empty file system), which will be commited as the result image. diff --git a/pacman/keyrings/archlinuxarm-revoked b/pacman/keyrings/archlinuxarm-revoked new file mode 100644 index 0000000..e69de29 diff --git a/pacman/keyrings/archlinuxarm-trusted b/pacman/keyrings/archlinuxarm-trusted new file mode 100644 index 0000000..3dd9bf4 --- /dev/null +++ b/pacman/keyrings/archlinuxarm-trusted @@ -0,0 +1,3 @@ +02922214DE8981D14DC2ACABBC704E86B823CD25:4: +9D22B7BB678DC056B1F7723CB55C5315DCD9EE1A:4: +69DD6C8FD314223E14362848BF7EEF7A9C6B5765:4: diff --git a/pacman/keyrings/archlinuxarm.gpg b/pacman/keyrings/archlinuxarm.gpg new file mode 100644 index 0000000..6b352c0 --- /dev/null +++ b/pacman/keyrings/archlinuxarm.gpg @@ -0,0 +1,238 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=5FlG +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=X/kt +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=7TM/ +-----END PGP PUBLIC KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +8+A0kBiaAmcY01U/upYXeHs= +=YwSO +-----END PGP PUBLIC KEY BLOCK----- diff --git a/pacman/pacstrap-docker b/pacman/pacstrap-docker new file mode 100755 index 0000000..646aca8 --- /dev/null +++ b/pacman/pacstrap-docker @@ -0,0 +1,31 @@ +#!/bin/bash + +out() { printf "$1 $2\n" "${@:3}"; } +error() { out "==> ERROR:" "$@"; } >&2 +die() { error "$@"; exit 1; } + +(( $# )) || die "No root directory specified" +newroot=$1; shift +pacman_args=("${@:-base}") + +if [[ $EUID -ne 0 ]]; then + die "This script must be run as root" +fi + +[[ -d $newroot ]] || die "%s is not a directory" "$newroot" + +echo 'Creating install root at %s' "$newroot" +mkdir -m 0755 -p "$newroot"/var/{cache/pacman/pkg,lib/pacman,log} "$newroot"/{dev,run,etc} +mkdir -m 1777 -p "$newroot"/tmp +mkdir -m 0555 -p "$newroot"/{sys,proc} + +echo 'Creating /dev/null in new root' +mknod "$newroot/dev/null" c 1 3 + +echo 'Installing packages to %s' "$newroot" +if ! pacman -r "$newroot" -Sy --noconfirm "${pacman_args[@]}"; then + die 'Failed to install packages to new root' +fi + +echo 'Deleting /dev/null from new root' +rm "$newroot/dev/null" diff --git a/pacman/repos b/pacman/repos new file mode 100644 index 0000000..f705a2e --- /dev/null +++ b/pacman/repos @@ -0,0 +1,14 @@ +[core] +Server = http://mirror.archlinuxarm.org/$arch/$repo + +[extra] +Server = http://mirror.archlinuxarm.org/$arch/$repo + +[community] +Server = http://mirror.archlinuxarm.org/$arch/$repo + +[alarm] +Server = http://mirror.archlinuxarm.org/$arch/$repo + +[aur] +Server = http://mirror.archlinuxarm.org/$arch/$repo