Padrão Docker GeoMK
Estrutura Basica de Projeto em Container Docker
Estrutura de arquivos/pasta
.
├── .env **(Configurações das variáveis da aplicação sistema para o Environment)**
├── .gitignore (Lista dos arquivos que não serão enviados ao repositórios)
├── CHANGELOG.md (Modelo da estrutura de projetos GeoMK)
├── docker-compose.yml (Arquivo do Compose para gerenciar o container de desenvolvimento)
├── behave (Estrutura para teste das aplicações)
│ ├── drives
│ │ ├── chromedrive
│ │ └── geckdriver
│ └── features
│ ├── login.feature
│ └── steps
├── conf (Arquivos modelo para configurações de ferramentas complementares)
│ ├── nginx.template.conf
│ └── odbc.template.ini
├── dockers (OBS: Incluir a versão da aplicação "ENV VERSION vX.Y.Z", ver exemplos)
│ ├── djn000
│ │ └── Dockerfile (Arquivo do Docker para criação da imagem)
│ ├── djn099
│ │ └── Dockerfile (Arquivo do Docker para criação de imagem secundária)
│ └── readme.md
├── documentos (Documentação do projeto)
│ ├── readme.md
│ ├── v2.0
│ │ └── tap.txt
│ └── v2.1
│ └── tap.txt
├── envs
│ ├── djn000.sample.env
│ ├── PostgreSql.env
│ └── readme.md
├── persisted (Pasta onde os arquivos da aplicação podem ser persistidos)
│ ├── configs
│ │ └── local_settings.sample.js
│ └── uploads
│ └── readme.md
├── README.md
└── source (Pasta com os fontes do projeto)
├── web (Front)
├── api (Back)
└── readme.md
Boas práticas dos projetos da GeoMK
- Sempre utilizar como imagem base as imagens com python da GeoMK. Elas são baseadas no Alpine Linux.
- Não utilizar mais local_settings.py ou local_settings.js, nem qualquer outro arquivo de configuração estático como nginx.conf, odbc.ini, etc. Nestes casos utilizar um template que deve ser salvo na pasta conf. Utilizar o envsub para gerar o arquivo no build. Ex: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf.
- Os estaticos do font-end devem ficar dentro da imagem em um pasta não persistida e devem ser coletados no build da imagem.
- Utilizar uWSGI com WhiteNoise
- Código do projeto no service
Documentações Auxiliares
- ChangeLog
- Todas as mudanças notáveis neste projeto serão documentadas neste arquivo. Exemplo de ChangeLog
- O formato é baseado em Keep a Changelog e este projeto adere a Semantic Versioning.
- Variáveis padrão das aplicações
Imagens base
As bases dos aplicativos GeoMK devem utilizar essas imagens com Python. Esta imagens foram contruidas com Alpine Linux 3.7 e serãoa tualizadas quando necessário.
Para fazer o download da imagem para o docker local:
>>> docker pull registry.geomk.com.br/python_geomk/3.6-dev:latest
>>> docker pull registry.geomk.com.br/python_geomk/3.6-prd:latest
- Para user como base do container no seu projeto
FROM registry.geomk.com.br/python_geomk/3.6-dev:latest
ou
FROM registry.geomk.com.br/python_geomk/3.6-prd:latest
Atalhos para o docker
alias dkc-clean='docker-compose down --rmi all -v'
alias dkc-exec='docker-compose exec --user $UID $*'
alias dkc-run='docker-compose run --user $UID $*'
alias dkc-up='docker-compose up $*'
alias dkc-up-prod='docker-compose -f docker-compose.prod.yml up $*'
alias dkc-up-prod-clean='dkc-clean && docker-compose -f docker-compose.prod.yml up $*'
# 1º Estágio de visa compila os requirements
FROM registry.geomk.com.br/python_geomk/3.6-dev:latest as builder
ENV PYTHONUNBUFFERED 1
RUN pip wheel -w /requirements/whl \
django=1.11 \
restframework==3.2
# 2º Stage
FROM registry.geomk.com.br/python_geomk/3.6-prd:latest
ENV VERSION v2.4.6
## Instalação de pacotes adicionals no Alpine Linux
RUN apk --update --no-cache add \
libjpeg \
zlib \
&& rm -rf /var/cache/apk/*
COPY --from=builder /requirements/whl /requirements/whl
RUN pip install /requirements/whl/* && rm -rf /requirements
## Criação do usuário que irá executar a aplicação dentro do container
RUN set -x \
&& addgroup -g 82 -S www-data \
&& adduser -u 82 -D -S -G www-data www-data
COPY ./source/core /core
COPY ./source/app_web /app_web
RUN python /core/manage.py collectstatic --no-input
RUN chmod 550 /core /app_web
USER www-data
WORKDIR /core
Modelo de Compose
- No caso de multiplos conteiners com o mesmo código fonte buildar uma imagem tagear com ${USER} e utilizar nos demais containers. Envitando assim muitiplos builds.
version: '3'
services:
djn009:
build:
context: .
dockerfile: dockers/djn009/Dockerfile
image: ${USER}_djn009
command: uwsgi --chdir=/source --module=project_certidoes.wsgi:application --env DJANGO_SETTINGS_MODULE=project_certidoes.settings --master --pidfile=/tmp/project-master.pid --socket=127.0.0.1:8001 --processes=4 --threads 1 --uid=82 --gid=82 --harakiri=240 --max-requests=1000 --vacuum --enable-threads --reload-on-rss=256 --evil-reload-on-rss=1024 --thunder-lock --http :8000
volumes:
- ./persisted:/persisted
- ./source:/source
ports:
- ${MYPORT}:8000
env_file:
- ./envs/DjangoEmailSuporte.env
- ./envs/ExternalLogin.env
- ./envs/MailQueue.env
- ./envs/PostgreSql.env
- .env
extra_hosts:
- pa2dev.ce.sebrae.com.br:200.19.183.205
- rian.ce.sebrae.com.br:200.19.183.205
djn009-tasks:
image: ${USER}_djn009
command: python manage.py run_tasks_loop
volumes:
- ./persisted:/persisted
- ./source:/source
env_file:
- ./envs/DjangoEmailSuporte.env
- ./envs/ExternalLogin.env
- ./envs/MailQueue.env
- ./envs/PostgreSql.env
- .env
depends_on:
- djn009
extra_hosts:
- pa2dev.ce.sebrae.com.br:200.19.183.205