125 lines
5.0 KiB
Docker
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"]
|