Skip to content

Commit 8182413

Browse files
committed
Try big docker refactoring
1 parent bd0703c commit 8182413

File tree

3 files changed

+72
-57
lines changed

3 files changed

+72
-57
lines changed

service/Dockerfile

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,56 @@
11
FROM php:8.2-fpm
22

3-
RUN apt-get update && apt-get install -y \
4-
libpq-dev \
5-
git \
6-
unzip \
7-
nginx \
8-
bash \
9-
docker.io \
10-
python3 \
11-
&& rm -rf /var/lib/apt/lists/*
12-
13-
RUN docker-php-ext-install pdo pdo_pgsql
14-
3+
# 1) Install system packages & PHP extensions
4+
RUN apt-get update \
5+
&& apt-get install -y \
6+
libpq-dev \
7+
git \
8+
unzip \
9+
nginx \
10+
bash \
11+
docker.io \
12+
python3 \
13+
&& docker-php-ext-install pdo pdo_pgsql \
14+
&& rm -rf /var/lib/apt/lists/*
15+
16+
# 2) Add www-data to the docker group (for socket use)
1517
RUN usermod -aG docker www-data
1618

1719
ENV DOCKER_HOST=unix:///var/run/docker.sock
1820

1921
WORKDIR /var/www/html
2022

21-
COPY . /var/www/html
22-
23-
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
23+
# 3) Cache Composer install early
24+
COPY composer.json composer.lock ./
25+
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
26+
&& composer install --no-dev --optimize-autoloader --no-interaction \
27+
&& rm -rf ~/.composer/cache
2428

25-
RUN composer install --no-dev --optimize-autoloader --no-interaction
29+
# 4) Copy the rest of your application
30+
COPY . .
2631

27-
COPY docker/nginx.conf /etc/nginx/sites-available/default
32+
# 5) Ensure runtime dirs exist & are owned by www-data
33+
RUN mkdir -p var/log var/cache public/submissions \
34+
&& chown -R www-data:www-data var \
35+
&& chmod -R 777 var/log var/cache public/submissions
2836

29-
RUN mkdir -p var/log var/cache public/submissions && \
30-
chown -R www-data:www-data /var/www/html && \
31-
chmod -R 755 /var/www/html && \
32-
chmod -R 777 var/log var/cache public/submissions
37+
# 6) Pre-warm Symfony prod cache (as root) and re-chown
38+
RUN php bin/console cache:clear --env=prod --no-warmup \
39+
&& php bin/console cache:warmup --env=prod \
40+
&& chown -R www-data:www-data var/cache
3341

42+
# 7) Replace php.ini with production settings
3443
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
3544

36-
COPY docker/start.sh /usr/local/bin/start
37-
RUN chmod +x /usr/local/bin/start
45+
# 8) Install your custom nginx vhost
46+
COPY docker/nginx.conf /etc/nginx/sites-available/default
47+
48+
# 9) Add entrypoint
49+
COPY docker/start.sh /usr/local/bin/start.sh
50+
RUN chmod +x /usr/local/bin/start.sh
3851

3952
EXPOSE 80
40-
CMD ["/usr/local/bin/start"]
53+
54+
# ENTRYPOINT will do migrations, start nginx+php-fpm, cleanup loop, etc.
55+
ENTRYPOINT ["start.sh"]
56+
CMD []

service/docker-compose.yml

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,35 @@
1+
version: "3.8"
2+
13
services:
24
php:
35
build: .
4-
volumes:
5-
- /var/run/docker.sock:/var/run/docker.sock:rw
6-
- ./:/var/www/html:rw
7-
- vendor_data:/var/www/html/vendor:rw
8-
- ./var/log:/var/www/html/var/log:rw
96
ports:
107
- "8055:80"
118
depends_on:
12-
- database
9+
database:
10+
condition: service_healthy
1311
environment:
1412
DATABASE_URL: "postgresql://${POSTGRES_USER:-app}:${POSTGRES_PASSWORD:-app}@database:5432/${POSTGRES_DB:-app}?serverVersion=${POSTGRES_VERSION:-16}"
1513
restart: unless-stopped
1614
mem_limit: 1g
1715
cpus: 1
16+
volumes:
17+
- /var/run/docker.sock:/var/run/docker.sock:rw
1818

1919
database:
2020
image: postgres:${POSTGRES_VERSION:-16}-alpine
2121
environment:
22+
POSTGRES_USER: ${POSTGRES_USER:-app}
2223
POSTGRES_DB: ${POSTGRES_DB:-app}
2324
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-app}
24-
POSTGRES_USER: ${POSTGRES_USER:-app}
2525
healthcheck:
2626
test: ["CMD", "pg_isready", "-d", "${POSTGRES_DB:-app}", "-U", "${POSTGRES_USER:-app}"]
2727
timeout: 5s
2828
retries: 5
2929
start_period: 10s
3030
volumes:
3131
- database_data:/var/lib/postgresql/data:rw
32-
33-
# It is only needed to immitate the behavior of admin during CTF
32+
3433
adminbot:
3534
build:
3635
context: .
@@ -40,9 +39,8 @@ services:
4039
- database
4140
environment:
4241
DATABASE_URL: "postgresql://${POSTGRES_USER:-app}:${POSTGRES_PASSWORD:-app}@database:5432/${POSTGRES_DB:-app}"
43-
APP_URL: "http://php:80"
42+
APP_URL: "http://php:80"
4443
restart: unless-stopped
4544

4645
volumes:
47-
database_data:
48-
vendor_data:
46+
database_data:

service/docker/start.sh

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
1-
#!/bin/bash
1+
#!/usr/bin/env bash
2+
set -e
23

3-
if [ -S /var/run/docker.sock ]; then
4-
chmod 666 /var/run/docker.sock
5-
fi
4+
# 1) Re-fix permissions on any runtime-generated dirs (in case Docker socket mount
5+
# or other ops changed ownership):
6+
chown -R www-data:www-data var/log var/cache public/submissions
67

7-
# Wait for database to be ready
8-
echo "Waiting for database connection..."
9-
until php -r "try { new PDO('pgsql:host=database;dbname=${POSTGRES_DB:-app}', '${POSTGRES_USER:-app}', '${POSTGRES_PASSWORD:-app}'); echo 'Connected successfully'; } catch (PDOException \$e) { echo \$e->getMessage(); exit(1); }" > /dev/null 2>&1; do
10-
echo -n "."
8+
# 2) Wait for Postgres
9+
echo "Waiting for database"
10+
until php -r "new PDO('pgsql:host=database;dbname=${POSTGRES_DB:-app}', '${POSTGRES_USER:-app}', '${POSTGRES_PASSWORD:-app}');" \
11+
> /dev/null 2>&1; do
1112
sleep 1
1213
done
13-
echo ""
14+
echo "Database ready."
1415

15-
echo "Running database migrations..."
16+
# 3) Run migrations (ignore if none)
17+
echo "Running migrations…"
1618
php bin/console doctrine:migrations:migrate --no-interaction || true
1719

18-
chown -R www-data:www-data /var/www/html/var/cache /var/www/html/var/log /var/www/html/public/submissions
19-
chmod -R 777 /var/www/html/var/cache /var/www/html/var/log /var/www/html/public/submissions
20+
# 4) Spawn cleanup loop in background
21+
(
22+
while true; do
23+
php bin/console app:purge-old-data || echo "[!] Purge error"
24+
sleep 60
25+
done
26+
) &
2027

21-
echo "Starting services..."
22-
service nginx start
23-
php-fpm &
24-
25-
while true; do
26-
echo "Cleanup Database..."
27-
php bin/console app:purge-old-data || echo "Purge error"
28-
sleep 60
29-
done
28+
# 5) Launch nginx (foreground) and php-fpm (exec = PID 1)
29+
nginx -g 'daemon off;' &
30+
exec php-fpm

0 commit comments

Comments
 (0)