-
Notifications
You must be signed in to change notification settings - Fork 40
Expand file tree
/
Copy pathDockerfile
More file actions
189 lines (177 loc) · 8.36 KB
/
Copy pathDockerfile
File metadata and controls
189 lines (177 loc) · 8.36 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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
FROM debian:bookworm-slim
LABEL author="Ym0t" maintainer="YmoT@tuta.com"
ARG PHP_VERSION
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
git \
apt-transport-https \
lsb-release \
ca-certificates \
wget \
curl \
gnupg2 \
debian-archive-keyring \
unzip \
certbot \
&& curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/mainline/debian bookworm nginx" > /etc/apt/sources.list.d/nginx.list \
&& printf "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" > /etc/apt/preferences.d/99nginx \
&& apt-get update \
&& apt-get install -y nginx \
&& ARCH=$(uname -m) \
&& if [ "$ARCH" = "x86_64" ]; then \
wget -O /tmp/cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb; \
elif [ "$ARCH" = "aarch64" ]; then \
wget -O /tmp/cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb; \
else \
echo "Unsupported architecture: $ARCH" && exit 1; \
fi \
&& dpkg -i /tmp/cloudflared.deb \
&& rm /tmp/cloudflared.deb \
&& wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg \
&& echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list \
# Retry apt-get update with exponential backoff for Sury repository
&& { \
success=0; \
for i in 1 2 3 4 5; do \
if apt-get update; then \
success=1; \
break; \
else \
echo "apt-get update failed (attempt $i/5), retrying in $((i * 10)) seconds..."; \
sleep $((i * 10)); \
fi; \
done; \
if [ "$success" -ne 1 ]; then \
echo "ERROR: apt-get update failed after 5 attempts. Sury repository may be unavailable."; \
exit 1; \
fi; \
} \
# Verify Sury repository is accessible
&& apt-cache show php${PHP_VERSION}-fpm >/dev/null 2>&1 || { \
echo "ERROR: php${PHP_VERSION}-fpm package not found. Sury repository may be unavailable."; \
exit 1; \
} \
&& apt-get install -y --no-install-recommends \
php${PHP_VERSION} \
php${PHP_VERSION}-fpm \
php${PHP_VERSION}-cli \
php${PHP_VERSION}-common \
php${PHP_VERSION}-mysqlnd \
php${PHP_VERSION}-pdo \
php${PHP_VERSION}-sybase \
php${PHP_VERSION}-psr \
php${PHP_VERSION}-xml \
php${PHP_VERSION}-bcmath \
php${PHP_VERSION}-calendar \
php${PHP_VERSION}-ctype \
php${PHP_VERSION}-curl \
php${PHP_VERSION}-dom \
php${PHP_VERSION}-mbstring \
php${PHP_VERSION}-fileinfo \
php${PHP_VERSION}-ftp \
php${PHP_VERSION}-gd \
php${PHP_VERSION}-gettext \
php${PHP_VERSION}-gmp \
php${PHP_VERSION}-iconv \
php${PHP_VERSION}-igbinary \
php${PHP_VERSION}-imagick \
php${PHP_VERSION}-imap \
php${PHP_VERSION}-intl \
php${PHP_VERSION}-ldap \
php${PHP_VERSION}-exif \
php${PHP_VERSION}-mongodb \
php${PHP_VERSION}-msgpack \
php${PHP_VERSION}-mysqli \
php${PHP_VERSION}-odbc \
php${PHP_VERSION}-pcov \
php${PHP_VERSION}-pgsql \
php${PHP_VERSION}-phar \
php${PHP_VERSION}-posix \
php${PHP_VERSION}-ps \
php${PHP_VERSION}-pspell \
php${PHP_VERSION}-readline \
php${PHP_VERSION}-shmop \
php${PHP_VERSION}-simplexml \
php${PHP_VERSION}-soap \
php${PHP_VERSION}-sockets \
php${PHP_VERSION}-sqlite3 \
php${PHP_VERSION}-sysvmsg \
php${PHP_VERSION}-sysvsem \
php${PHP_VERSION}-sysvshm \
php${PHP_VERSION}-tokenizer \
php${PHP_VERSION}-xmlreader \
php${PHP_VERSION}-xmlwriter \
php${PHP_VERSION}-xsl \
php${PHP_VERSION}-zip \
php${PHP_VERSION}-mailparse \
php${PHP_VERSION}-inotify \
php${PHP_VERSION}-maxminddb \
php${PHP_VERSION}-protobuf \
php${PHP_VERSION}-dev \
# Optional packages (may not be available for all PHP versions)
&& apt-get install -y --no-install-recommends php${PHP_VERSION}-memcache || true \
&& apt-get install -y --no-install-recommends php${PHP_VERSION}-memcached || true \
&& apt-get install -y --no-install-recommends php${PHP_VERSION}-opcache || true \
# Final verification: ensure PHP-FPM was installed correctly
&& command -v php-fpm${PHP_VERSION} >/dev/null 2>&1 || { \
echo "ERROR: php-fpm${PHP_VERSION} binary not found after installation!"; \
echo "This indicates the PHP installation failed. Aborting build."; \
exit 1; \
} \
&& echo "PHP ${PHP_VERSION} installed successfully: $(php${PHP_VERSION} -v | head -1)" \
&& wget -q -O /tmp/composer.phar https://getcomposer.org/download/latest-stable/composer.phar \
&& SHA256=$(wget -q -O - https://getcomposer.org/download/latest-stable/composer.phar.sha256) \
&& echo "$SHA256 /tmp/composer.phar" | sha256sum -c - \
&& mv /tmp/composer.phar /usr/local/bin/composer \
&& chmod +x /usr/local/bin/composer \
&& rm -rf /var/lib/apt/lists/*
# ionCube Loader (optional - may not be available for newest PHP versions)
RUN ARCH=$(uname -m); \
if [ "$ARCH" = "x86_64" ]; then \
IONCUBE_ARCH="x86-64"; \
elif [ "$ARCH" = "aarch64" ]; then \
IONCUBE_ARCH="aarch64"; \
else \
echo "ionCube: Unsupported architecture $ARCH - skipping"; \
exit 0; \
fi; \
cd /tmp; \
wget -q -O ioncube.tar.gz "https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_${IONCUBE_ARCH}.tar.gz" || { echo "ionCube download failed - skipping"; exit 0; }; \
tar xzf ioncube.tar.gz; \
if [ -f "ioncube/ioncube_loader_lin_${PHP_VERSION}.so" ]; then \
PHP_EXT_DIR=$(find /usr/lib/php -maxdepth 1 -type d -name "20*" | head -1); \
if [ -n "$PHP_EXT_DIR" ]; then \
cp "ioncube/ioncube_loader_lin_${PHP_VERSION}.so" "$PHP_EXT_DIR/"; \
echo "zend_extension=${PHP_EXT_DIR}/ioncube_loader_lin_${PHP_VERSION}.so" > /etc/php/${PHP_VERSION}/cli/conf.d/00-ioncube.ini; \
echo "zend_extension=${PHP_EXT_DIR}/ioncube_loader_lin_${PHP_VERSION}.so" > /etc/php/${PHP_VERSION}/fpm/conf.d/00-ioncube.ini; \
echo "ionCube Loader installed for PHP ${PHP_VERSION}"; \
else \
echo "PHP extension directory not found - skipping ionCube"; \
fi; \
else \
echo "ionCube Loader not available for PHP ${PHP_VERSION} - skipping"; \
fi; \
rm -rf /tmp/ioncube*
# ImageMagick security policy to allow PDF operations
RUN POLICY_FILE=$(find /etc -name "policy.xml" -path "*/ImageMagick*" 2>/dev/null | head -1); \
if [ -n "$POLICY_FILE" ]; then \
echo "Updating ImageMagick policy: $POLICY_FILE"; \
sed -i 's/<policy domain="coder" rights="none" pattern="PDF" \/>/<policy domain="coder" rights="read|write" pattern="PDF" \/>/g' "$POLICY_FILE"; \
sed -i 's/<policy domain="coder" rights="none" pattern="PS" \/>/<policy domain="coder" rights="read|write" pattern="PS" \/>/g' "$POLICY_FILE"; \
sed -i 's/<policy domain="coder" rights="none" pattern="EPS" \/>/<policy domain="coder" rights="read|write" pattern="EPS" \/>/g' "$POLICY_FILE"; \
sed -i 's/<policy domain="coder" rights="none" pattern="XPS" \/>/<policy domain="coder" rights="read|write" pattern="XPS" \/>/g' "$POLICY_FILE"; \
echo "ImageMagick PDF/PS policy updated successfully"; \
else \
echo "ImageMagick policy.xml not found - skipping"; \
fi
# Create user and set environment variables
RUN useradd -m -d /home/container/ -s /bin/bash container \
&& echo "USER=container" >> /etc/environment \
&& echo "HOME=/home/container" >> /etc/environment
WORKDIR /home/container
STOPSIGNAL SIGINT
# Copy entrypoint script
COPY ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
CMD ["/entrypoint.sh"]