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"]