Skip to content

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

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