mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-11-08 14:17:57 +00:00
- moved init.sh from template to files/ for direct copying and bind mounting - removed hardcoded user creation from init process - added database emptiness check before running system:install - added new task 03_admin.yml to ensure admin user exists and update password/email via Ansible - switched docker exec shell from bash to sh for Alpine compatibility - updated Dockerfile and docker-compose.yml accordingly for mount-based init script
93 lines
3.5 KiB
Django/Jinja
93 lines
3.5 KiB
Django/Jinja
# ------------------------------------------------------------------------------
|
|
# Shopware Application Image (Alpine-compatible)
|
|
# ------------------------------------------------------------------------------
|
|
# - Stage 1 (builder): use Composer to fetch Shopware while ignoring build-time
|
|
# PHP extensions (we'll install them in the runtime image).
|
|
# - Stage 2 (runtime): install required PHP extensions and copy the app + init.sh
|
|
# ------------------------------------------------------------------------------
|
|
|
|
############################
|
|
# Stage 1: Builder
|
|
############################
|
|
FROM composer:2.7 AS builder
|
|
ENV COMPOSER_ALLOW_SUPERUSER=1 \
|
|
COMPOSER_NO_INTERACTION=1 \
|
|
COMPOSER_PROCESS_TIMEOUT=900
|
|
|
|
WORKDIR /app
|
|
ARG SHOPWARE_PROD_VERSION=shopware/production:6.7.3.1
|
|
|
|
# 1) Scaffold project without installing dependencies
|
|
RUN set -eux; \
|
|
composer create-project "${SHOPWARE_PROD_VERSION}" /app --no-install
|
|
|
|
# 2) Install dependencies (ignoring build-time extension checks) + add Redis transport
|
|
RUN set -eux; \
|
|
composer install \
|
|
--no-dev \
|
|
--optimize-autoloader \
|
|
--no-progress \
|
|
--no-scripts \
|
|
--ignore-platform-req=ext-gd \
|
|
--ignore-platform-req=ext-intl \
|
|
--ignore-platform-req=ext-pdo_mysql; \
|
|
composer require symfony/redis-messenger:^6.4 \
|
|
-W \
|
|
--no-scripts \
|
|
--no-progress \
|
|
--update-no-dev \
|
|
--ignore-platform-req=ext-gd \
|
|
--ignore-platform-req=ext-intl \
|
|
--ignore-platform-req=ext-pdo_mysql \
|
|
--ignore-platform-req=ext-redis
|
|
|
|
|
|
############################
|
|
# Stage 2: Runtime
|
|
############################
|
|
FROM ghcr.io/shopware/docker-base:8.3
|
|
WORKDIR /var/www/html
|
|
|
|
# Install required PHP extensions in the Alpine-based runtime
|
|
# (try php83-*, fall back to php82-*, then to generic)
|
|
USER root
|
|
RUN set -eux; \
|
|
apk add --no-cache php83-gd || apk add --no-cache php82-gd || apk add --no-cache php-gd || true; \
|
|
apk add --no-cache php83-intl || apk add --no-cache php82-intl || apk add --no-cache php-intl || true; \
|
|
apk add --no-cache php83-pdo_mysql || apk add --no-cache php82-pdo_mysql || apk add --no-cache php-pdo_mysql || true; \
|
|
apk add --no-cache php83-redis || apk add --no-cache php82-redis || apk add --no-cache php-redis || true
|
|
|
|
# Copy built application from the builder
|
|
COPY --chown=www-data:www-data --from=builder /app /var/www/html
|
|
|
|
# Optional: snapshot of pristine app to seed an empty volume (used by init container)
|
|
RUN mkdir -p /usr/src/shopware \
|
|
&& cp -a /var/www/html/. /usr/src/shopware/. \
|
|
&& chown -R www-data:www-data /var/www/html /usr/src/shopware
|
|
|
|
# Ensure writable directories exist with correct ownership
|
|
RUN set -eux; \
|
|
mkdir -p \
|
|
/var/www/html/files \
|
|
/var/www/html/var \
|
|
/var/www/html/public/media \
|
|
/var/www/html/public/thumbnail \
|
|
/var/www/html/public/sitemap \
|
|
/var/www/html/public/theme; \
|
|
chown -R www-data:www-data /var/www/html
|
|
|
|
# Add trusted proxies wiring (Symfony reads env TRUSTED_PROXIES)
|
|
RUN set -eux; \
|
|
mkdir -p /var/www/html/config/packages; \
|
|
if [ ! -f /var/www/html/config/packages/framework.yaml ]; then \
|
|
printf "framework:\n trusted_proxies: '%%env(TRUSTED_PROXIES)%%'\n" > /var/www/html/config/packages/framework.yaml; \
|
|
fi
|
|
|
|
# Drop back to the app user
|
|
USER www-data
|
|
|
|
# Expose internal port & add a lightweight healthcheck
|
|
EXPOSE 8000
|
|
HEALTHCHECK --interval=30s --timeout=5s --retries=5 --start-period=20s \
|
|
CMD php -r '$s=@fsockopen("127.0.0.1", 8000, $e, $t, 3); if(!$s) exit(1); fclose($s);'
|