Files
rkm-conectasus-ci-sandbox/Dockerfile
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

125 lines
5.0 KiB
Docker

ARG BASE_IMAGE=tirkm/v1-automation-ci
# Node 10 / npm 6 — o mesmo toolchain com que este projeto (vue 2.6 /
# @vue/cli-service 4.5) e construido hoje. Subir de versao aqui e uma mudanca
# a parte: muda o bundle gerado, e merece ser validada por si.
ARG NODE_IMAGE=node:10-alpine
# ---------------------------------------------------------------------------
# Frontend: npm so existe neste stage, e numa imagem dedicada — a base de
# runtime nao carrega toolchain de frontend. Para o runtime atravessa apenas o
# dist/.
# ---------------------------------------------------------------------------
FROM ${NODE_IMAGE} AS frontend-build
WORKDIR /build
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci --no-audit --no-fund
COPY frontend/ ./
# Nenhum .env entra aqui de proposito. A config do frontend e resolvida em
# RUNTIME, via public/config.js -> window.__APP_CONFIG__ (ver src/config.js),
# com o arquivo real montado no deploy. E o que mantem uma unica imagem servindo
# teste, homolog e producao: o binario homologado e o mesmo que vai para prod.
#
# Node 10 limita o heap a ~1.5GB por padrao e o webpack deste projeto estoura
# esse teto ("JavaScript heap out of memory"). O build so passa com o limite
# elevado.
RUN NODE_OPTIONS=--max-old-space-size=4096 npm run build
# ---------------------------------------------------------------------------
# API
# ---------------------------------------------------------------------------
FROM ${BASE_IMAGE} AS build
WORKDIR /build
COPY api/composer.json api/composer.lock ./
RUN composer install \
--no-dev \
--no-scripts \
--no-autoloader \
--no-interaction \
--prefer-dist \
--no-progress
COPY api/ ./
RUN set -eux; \
mkdir -p bootstrap/cache storage/framework/cache storage/framework/views storage/framework/sessions storage/logs; \
cp .env.example .env; \
cp connections.json.example connections.json; \
composer dump-autoload --no-dev --optimize --no-interaction; \
php artisan key:generate --no-interaction; \
php artisan route:cache; \
rm -f .env connections.json; \
rm -rf tests .git .idea .vscode; \
rm -f docker-compose.yml phpunit.xml .styleci.yml .editorconfig \
package.json package-lock.json webpack.mix.js .phpunit.result.cache; \
find storage/logs -type f -delete
# ---------------------------------------------------------------------------
# Runtime
# ---------------------------------------------------------------------------
FROM ${BASE_IMAGE} AS runtime
ARG APP_VERSION=dev
ARG VCS_REF=unknown
ARG BUILD_DATE=unknown
ARG SOURCE_URL=http://192.168.0.41:3001/rkm/conectasus
LABEL org.opencontainers.image.title="ConectaSUS V2" \
org.opencontainers.image.description="API Laravel + frontend Vue do ConectaSUS V2, encapsulados" \
org.opencontainers.image.version="${APP_VERSION}" \
org.opencontainers.image.revision="${VCS_REF}" \
org.opencontainers.image.created="${BUILD_DATE}" \
org.opencontainers.image.source="${SOURCE_URL}" \
org.opencontainers.image.vendor="RKM Sistemas"
ENV APP_VERSION=${APP_VERSION}
COPY docker/apache/ports.conf /etc/apache2/ports.conf
COPY docker/apache/000-default.conf /etc/apache2/sites-enabled/000-default.conf
COPY docker/apache/frontend.conf /etc/apache2/sites-enabled/frontend.conf
COPY docker/supervisor/conf.d/ /etc/supervisor/conf.d/
COPY docker/entrypoint.sh /usr/local/bin/entrypoint
# O frontend.conf usa 'Header set Cache-Control' no config.js, e mod_headers vem
# desabilitado na base :6. A base enxuta ja o habilita, mas manter aqui e de
# proposito: a2enmod e idempotente, e assim a imagem funciona sobre qualquer uma
# das duas bases em vez de depender de um detalhe interno dela.
RUN a2enmod headers
RUN chmod +x /usr/local/bin/entrypoint
COPY --from=build --chown=www-data:www-data /build /var/www/api
RUN set -eux; \
mkdir -p /var/www/api/storage/framework/cache \
/var/www/api/storage/framework/views \
/var/www/api/storage/framework/sessions \
/var/www/api/storage/logs \
/var/www/api/storage/app/public \
/var/www/api/storage/app/documento \
/var/www/api/storage/app/intranet \
/var/www/api/bootstrap/cache; \
chown -R www-data:www-data /var/www/api/storage /var/www/api/bootstrap/cache; \
chmod -R ug+rwX /var/www/api/storage /var/www/api/bootstrap/cache
# Por ultimo de proposito: e a camada que mais muda. Assim uma alteracao so de
# frontend nao invalida as camadas pesadas da API (vendor/, caches de boot).
COPY --from=frontend-build --chown=www-data:www-data /build/dist /var/www/frontend/dist
WORKDIR /var/www
EXPOSE 80 8080 6001
ENTRYPOINT ["/usr/local/bin/entrypoint"]
# -n (nodaemon) e obrigatorio: o supervisord.conf da imagem base nao define
# nodaemon=true, entao sem esta flag o supervisord daemoniza, o processo em
# primeiro plano encerra e o container sai com exit 0 logo apos subir.
CMD ["supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]