diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a6f7860..3a085cb 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -40,6 +40,22 @@ jobs: # {{major}}-base type=semver,enable=${{ matrix.composer_version == '2' && (matrix.latest_major == 'true' || matrix.latest == 'true') }},pattern={{major}},suffix=-base,value=${{ matrix.php_version }}.0 + - name: Docker meta (base-rootless) + id: meta-base-rootless + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 + with: + images: | + clevyr/php + ghcr.io/clevyr/php + flavor: latest=false + tags: | + # {{major}}.{{minor}}-composer{{major}}-base-rootless + type=semver,pattern={{major}}.{{minor}},suffix=-composer${{ matrix.composer_version }}-base,value=${{ matrix.php_version }}.0 + # {{major}}.{{minor}}-base-rootless + type=semver,enable=${{ matrix.composer_version == '2' }},pattern={{major}}.{{minor}},suffix=-base-rootless,value=${{ matrix.php_version }}.0 + # {{major}}-base-rootless + type=semver,enable=${{ matrix.composer_version == '2' && (matrix.latest_major == 'true' || matrix.latest == 'true') }},pattern={{major}},suffix=-base-rootless,value=${{ matrix.php_version }}.0 + - name: Docker meta (onbuild) id: meta-onbuild uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 @@ -66,6 +82,30 @@ jobs: # {{major}} type=semver,enable=${{ matrix.composer_version == '2' && (matrix.latest_major == 'true' || matrix.latest == 'true') }},pattern={{major}},value=${{ matrix.php_version }}.0 + - name: Docker meta (onbuild-rootless) + id: meta-onbuild-rootless + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 + with: + images: | + clevyr/php + ghcr.io/clevyr/php + flavor: latest=false + tags: | + # {{major}}.{{minor}}-composer{{major}}-onbuild-rootless + type=semver,pattern={{major}}.{{minor}},suffix=-composer${{ matrix.composer_version }}-onbuild-rootless,value=${{ matrix.php_version }}.0 + # {{major}}.{{minor}}-composer{{major}} + type=semver,pattern={{major}}.{{minor}},suffix=-composer${{ matrix.composer_version }},value=${{ matrix.php_version }}.0 + # {{major}}.{{minor}}-onbuild-rootless + type=semver,enable=${{ matrix.composer_version == '2' }},pattern={{major}}.{{minor}},suffix=-onbuild-rootless,value=${{ matrix.php_version }}.0 + # {{major}}.{{minor}} + type=semver,enable=${{ matrix.composer_version == '2' }},pattern={{major}}.{{minor}},value=${{ matrix.php_version }}.0 + # {{major}}-composer{{major}} + type=semver,enable=${{ (matrix.latest_major == 'true' || matrix.latest == 'true') }},pattern={{major}},suffix=-composer${{ matrix.composer_version }},value=${{ matrix.php_version }}.0 + # {{major}}-onbuild-rootless + type=semver,enable=${{ matrix.composer_version == '2' && (matrix.latest_major == 'true' || matrix.latest == 'true') }},pattern={{major}},suffix=-onbuild-rootless,value=${{ matrix.php_version }}.0 + # {{major}} + type=semver,enable=${{ matrix.composer_version == '2' && (matrix.latest_major == 'true' || matrix.latest == 'true') }},pattern={{major}},value=${{ matrix.php_version }}.0 + - name: Set up QEMU uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 @@ -121,6 +161,22 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max + - name: Build and Push (base-rootless) + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + pull: true + push: ${{ github.ref_name == 'main' }} + platforms: ${{ matrix.platforms }} + tags: ${{ steps.meta-base-rootless.outputs.tags }} + labels: ${{ steps.meta-base-rootless.outputs.labels }} + build-args: | + COMPOSER_VERSION=${{ matrix.composer_version }} + PHP_VERSION=${{ matrix.php_version }} + target: base-rootless + cache-from: type=gha + cache-to: type=gha,mode=max + - name: Build and Push (onbuild) uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: @@ -135,3 +191,18 @@ jobs: target: onbuild cache-from: type=gha cache-to: type=gha,mode=max + + - name: Build and Push (onbuild-rootless) + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + push: ${{ github.ref_name == 'main' }} + platforms: ${{ matrix.platforms }} + tags: ${{ steps.meta-onbuild-rootless.outputs.tags }} + labels: ${{ steps.meta-onbuild-rootless.outputs.labels }} + build-args: | + COMPOSER_VERSION=${{ matrix.composer_version }} + PHP_VERSION=${{ matrix.php_version }} + target: onbuild-rootless + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index 6076da6..e485379 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,6 @@ ARG ALPINE_VERSION FROM composer:$COMPOSER_VERSION AS local-composer FROM php:$PHP_VERSION-fpm-alpine$ALPINE_VERSION AS base -WORKDIR /app COPY --from=mlocati/php-extension-installer:2.8.5 /usr/bin/install-php-extensions /usr/bin/ @@ -36,7 +35,7 @@ RUN < /etc/nginx/conf.d/default.conf + NGINX_EXPIRES="${NGINX_EXPIRES:-7d}" \ + NGINX_PORT="${NGINX_PORT:-80}" +envsubst '$NGINX_ROOT $NGINX_EXPIRES $NGINX_PORT' < /etc/nginx/conf.d/default.conf.tpl > /etc/nginx/conf.d/default.conf log 'Removing all tmp files' rm -rf /tmp/* diff --git a/rootfs/usr/bin/s6-svscan-rootless b/rootfs/usr/bin/s6-svscan-rootless new file mode 100755 index 0000000..f68e10b --- /dev/null +++ b/rootfs/usr/bin/s6-svscan-rootless @@ -0,0 +1,25 @@ +#!/bin/sh + +set -euo pipefail + +# Wrapper to run s6-svscan from a writable directory +# s6-svscan creates .s6-svscan in the service directory, so we need to copy services to /tmp + +# See https://skarnet.org/software/s6/scandir.html + +SERVICE_DIR="$1" + +if [ -z "$SERVICE_DIR" ]; then + echo "Usage: $0 " >&2 + exit 1 +fi + +# Create a unique directory in /tmp for our services +TEMP_SERVICE_DIR="/tmp/s6-services-$$" +mkdir -p "$TEMP_SERVICE_DIR" + +# Copy the service directory contents to /tmp +cp -r "$SERVICE_DIR"/* "$TEMP_SERVICE_DIR/" 2>/dev/null || cp -r "$SERVICE_DIR"/. "$TEMP_SERVICE_DIR/" + +# Run s6-svscan against the copied services +exec s6-svscan "$TEMP_SERVICE_DIR"