forked from FOSSBilling/FOSSBilling
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
154 lines (120 loc) · 5.53 KB
/
Dockerfile
File metadata and controls
154 lines (120 loc) · 5.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# syntax=docker/dockerfile:1.24@sha256:87999aa3d42bdc6bea60565083ee17e86d1f3339802f543c0d03998580f9cb89
ARG PHP_VERSION=8.5
ARG NODE_VERSION=24
FROM php:${PHP_VERSION}-apache AS php-base
RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
ca-certificates \
cron \
curl \
libbz2-dev \
libfreetype6-dev \
libicu-dev \
libjpeg62-turbo-dev \
libpng-dev \
libzip-dev \
unzip \
zlib1g-dev; \
docker-php-ext-configure gd --with-freetype --with-jpeg; \
docker-php-ext-install -j"$(nproc)" bz2 gd intl pdo_mysql zip; \
a2enmod rewrite; \
apt-mark auto '.*' > /dev/null; \
apt-mark manual \
${savedAptMark} \
ca-certificates \
cron \
curl \
unzip; \
find /usr/local -type f \( -perm /0111 -o -name '*.so' \) -exec sh -c 'ldd "$@" 2>/dev/null' sh '{}' + \
| awk 'NF == 4 && $2 == "=>" { print $3 } NF == 2 && $1 ~ /^\// { print $1 }' \
| sort -u \
| while read -r library; do \
library="$(readlink -e "${library}")"; \
dpkg-query --search "${library}" 2>/dev/null | grep -v '^diversion ' | head -n1 | cut -d: -f1; \
done \
| sort -u \
| xargs -r apt-mark manual; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
apt-get clean; \
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
FROM php-base AS composer-base
WORKDIR /app
COPY --from=composer:2@sha256:1364b5b9132ab4c42ea3be53e894572c32fe75a512cb3b1c3903fcc9bce53dcc /usr/bin/composer /usr/bin/composer
RUN apt-get update \
&& apt-get install -y --no-install-recommends git \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
FROM composer-base AS php-vendor
COPY composer.json composer.lock ./
RUN --mount=type=cache,target=/tmp/composer-cache \
COMPOSER_CACHE_DIR=/tmp/composer-cache \
composer install --prefer-dist --no-dev --optimize-autoloader --no-interaction --no-progress
FROM composer-base AS php-dev-vendor
COPY composer.json composer.lock ./
RUN --mount=type=cache,target=/tmp/composer-cache \
COMPOSER_CACHE_DIR=/tmp/composer-cache \
composer install --prefer-dist --optimize-autoloader --no-interaction --no-progress
FROM node:${NODE_VERSION}-bookworm-slim AS frontend-assets
WORKDIR /app
COPY package.json package-lock.json ./
COPY src/themes/admin_default/package.json src/themes/admin_default/package.json
COPY src/themes/huraga/package.json src/themes/huraga/package.json
RUN --mount=type=cache,target=/root/.npm npm ci
COPY src/themes/admin_default ./src/themes/admin_default
COPY src/themes/huraga ./src/themes/huraga
COPY src/modules ./src/modules
RUN NODE_ENV=production npm run build
FROM php-base AS release-tree
WORKDIR /app
ARG FOSSBILLING_VERSION=0.0.1
ARG FOSSBILLING_VERSION_TRUNCATE=0
ARG SENTRY_DSN=
ARG INSTALL_TRANSLATIONS=true
ARG TRANSLATIONS_URL=https://github.com/FOSSBilling/locale/releases/latest/download/translations.zip
ARG TRANSLATIONS_SHA256=
COPY src ./src
COPY README.md LICENSE ./src/
COPY --from=php-vendor /app/src/vendor ./src/vendor
COPY --from=frontend-assets /app/src/themes/admin_default/assets/build ./src/themes/admin_default/assets/build
COPY --from=frontend-assets /app/src/themes/huraga/assets/build ./src/themes/huraga/assets/build
RUN set -eux; \
mkdir -p ./src/locale; \
if [ "${INSTALL_TRANSLATIONS}" = "true" ]; then \
curl -fsSL "${TRANSLATIONS_URL}" -o /tmp/translations.zip; \
if [ -n "${TRANSLATIONS_SHA256}" ]; then \
echo "${TRANSLATIONS_SHA256} /tmp/translations.zip" | sha256sum -c -; \
fi; \
unzip -oq /tmp/translations.zip -d ./src/locale; \
rm /tmp/translations.zip; \
fi; \
FOSSBILLING_VERSION="${FOSSBILLING_VERSION}" \
FOSSBILLING_VERSION_TRUNCATE="${FOSSBILLING_VERSION_TRUNCATE}" \
SENTRY_DSN="${SENTRY_DSN}" \
php -r '$version = getenv("FOSSBILLING_VERSION") ?: "0.0.1"; $truncate = (int) (getenv("FOSSBILLING_VERSION_TRUNCATE") ?: 0); if ($truncate > 0) { $version = substr($version, 0, $truncate); } $versionFile = "./src/library/FOSSBilling/Version.php"; file_put_contents($versionFile, str_replace("0.0.1", $version, file_get_contents($versionFile))); $dsn = getenv("SENTRY_DSN"); if ($dsn !== false && $dsn !== "") { $sentryFile = "./src/library/FOSSBilling/SentryHelper.php"; file_put_contents($sentryFile, str_replace("--replace--this--during--release--process--", $dsn, file_get_contents($sentryFile))); }'; \
chmod -R u=rwX,go=rX ./src
FROM scratch AS release-artifact
COPY --from=release-tree /app/src /
FROM php-base AS runtime
WORKDIR /var/www/html
COPY --from=release-tree --chown=www-data:www-data /app/src/ ./
RUN set -eux; \
mkdir -p data/cache data/log data/uploads; \
touch config.php /var/log/cron.log; \
chown -R www-data:www-data data config.php /var/log/cron.log; \
echo '*/5 * * * * /usr/local/bin/php /var/www/html/cron.php >> /var/log/cron.log 2>&1' > /tmp/www-data.cron; \
crontab -u www-data /tmp/www-data.cron; \
rm /tmp/www-data.cron
CMD ["sh", "-c", "cron & exec apache2-foreground"]
FROM runtime AS test
WORKDIR /workspace
COPY --from=release-tree /app/src ./src
COPY --from=php-dev-vendor /app/src/vendor ./src/vendor
COPY composer.json composer.lock phpstan.neon phpstan-baseline.neon phpunit.xml.dist phpunit-live.xml ./
COPY tests ./tests
COPY tests-legacy ./tests-legacy
RUN set -eux; \
php -r '$config = require "./src/config-sample.php"; file_put_contents("./src/config.php", "<?php\nreturn " . var_export($config, true) . ";\n");'; \
mkdir -p ./src/data/cache ./src/data/log ./src/data/uploads; \
chown -R www-data:www-data ./src/data ./src/config.php