11# Accepted values: 8.3 - 8.2
22ARG PHP_VERSION=8.3
33
4- ARG COMPOSER_VERSION=latest
4+ # ##########################################
5+ # Composer dependencies stage
6+ # ##########################################
7+ FROM composer:latest AS composer-deps
58
6- ARG NODE_VERSION=20-alpine
9+ WORKDIR /app
710
8- # ##########################################
11+ # Copy composer files
12+ COPY composer.json composer.lock ./
913
10- FROM composer:${COMPOSER_VERSION} AS vendor
14+ # Install composer dependencies (no autoloader yet, will optimize in final stage)
15+ RUN composer install \
16+ --no-dev \
17+ --no-interaction \
18+ --no-autoloader \
19+ --no-ansi \
20+ --no-scripts \
21+ --prefer-dist
1122
23+ # ##########################################
24+ # Main application stage
25+ # ##########################################
1226FROM php:${PHP_VERSION}-cli-alpine
1327
1428LABEL maintainer="SMortexa <seyed.me720@gmail.com>"
@@ -39,8 +53,9 @@ RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
3953
4054ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
4155
42- RUN apk update; \
43- apk upgrade; \
56+ # Install system dependencies and PHP extensions in one layer
57+ RUN apk update && \
58+ apk upgrade && \
4459 apk add --no-cache \
4560 curl \
4661 wget \
@@ -49,9 +64,8 @@ RUN apk update; \
4964 procps \
5065 ca-certificates \
5166 supervisor \
52- libsodium-dev \
53- # Install PHP extensions
54- && install-php-extensions \
67+ libsodium-dev && \
68+ install-php-extensions \
5569 bz2 \
5670 pcntl \
5771 mbstring \
@@ -70,9 +84,9 @@ RUN apk update; \
7084 memcached \
7185 igbinary \
7286 ldap \
73- swoole \
74- && docker-php-source delete \
75- && rm -rf /var/cache/apk/* /tmp/* /var/tmp/*
87+ swoole && \
88+ docker-php-source delete && \
89+ rm -rf /var/cache/apk/* /tmp/* /var/tmp/*
7690
7791RUN arch="$(apk --print-arch)" \
7892 && case "$arch" in \
@@ -99,48 +113,48 @@ RUN cp ${PHP_INI_DIR}/php.ini-production ${PHP_INI_DIR}/php.ini
99113
100114USER ${USER}
101115
102- COPY --chown=${USER}:${USER} -- from=vendor /usr/bin/composer /usr/bin/composer
103- COPY --chown=${USER}:${USER} composer.json composer.lock ./
116+ # Install Composer from official image
117+ COPY --from=composer:latest /usr/bin/ composer /usr/bin/composer
104118
105- RUN composer install \
106- --no-dev \
107- --no-interaction \
108- --no-autoloader \
109- --no-ansi \
110- --no-scripts \
111- --audit
119+ # Copy vendor from composer-deps stage for better caching
120+ COPY --chown=${USER}:${USER} --from=composer-deps /app/vendor ./vendor
112121
113- COPY --chown=${USER}:${USER} . .
122+ # Copy composer files (needed for autoloader generation)
123+ COPY --chown=${USER}:${USER} composer.json composer.lock ./
114124
125+ # Generate optimized autoloader with vendor already in place
126+ RUN composer dump-autoload --classmap-authoritative --no-dev && \
127+ composer clear-cache
128+
129+ # Copy application code
130+ COPY --chown=${USER}:${USER} . .
131+
132+ # Create necessary Laravel directories
115133RUN mkdir -p \
116134 storage/framework/sessions \
117135 storage/framework/views \
118136 storage/framework/cache \
119137 storage/framework/testing \
120138 storage/logs \
121- bootstrap/cache && chmod -R a+rw storage
139+ bootstrap/cache && \
140+ chmod -R a+rw storage
122141
123- COPY --chown=${USER}:${USER} .docker/supervisord.conf /etc/supervisor/
124- COPY --chown=${USER}:${USER} .docker/octane/Swoole/supervisord.swoole.conf /etc/supervisor/conf.d/
125- COPY --chown=${USER}:${USER} .docker/supervisord.*.conf /etc/supervisor/conf.d/
126- COPY --chown=${USER}:${USER} .docker/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini
127- COPY --chown=${USER}:${USER} .docker/start-container /usr/local/bin/start-container
142+ # Copy configuration files
143+ COPY --chown=${USER}:${USER} .docker/supervisord.conf /etc/supervisor/
144+ COPY --chown=${USER}:${USER} .docker/octane/Swoole/supervisord.swoole.conf /etc/supervisor/conf.d/
145+ COPY --chown=${USER}:${USER} .docker/supervisord.*.conf /etc/supervisor/conf.d/
146+ COPY --chown=${USER}:${USER} .docker/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini
147+ COPY --chown=${USER}:${USER} .docker/start-container /usr/local/bin/start-container
128148
129- RUN composer install \
130- --classmap-authoritative \
131- --no-interaction \
132- --no-ansi \
133- --no-dev \
134- && composer clear-cache
149+ # Copy environment file
150+ COPY --chown=${USER}:${USER} .env.example ./.env
135151
136- COPY .env.example ./.env
137-
138- RUN chmod +x /usr/local/bin/start-container
139-
140- RUN cat .docker/utilities.sh >> ~/.bashrc
152+ RUN chmod +x /usr/local/bin/start-container && \
153+ cat .docker/utilities.sh >> ~/.bashrc
141154
142155EXPOSE 8000
143156
144157ENTRYPOINT ["start-container" ]
145158
146159HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD php artisan octane:status || exit 1
160+
0 commit comments