This commit is contained in:
124
Dockerfile
Normal file
124
Dockerfile
Normal file
@@ -0,0 +1,124 @@
|
||||
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"]
|
||||
Reference in New Issue
Block a user