Ambiente Docker baseado em Debian para:
- Compilar o PostgreSQL 15.2 a partir do código‑fonte.
- Inicializar o cluster de dados em
/db/data. - Subir o servidor automaticamente.
- Instalar e habilitar a extensão
pg_buffercache. - Usar um shell confortável com zsh, Oh My Zsh e powerlevel10k.
Arquitetura:
- Código‑fonte do PostgreSQL:
/usr/local/src/postgres-15(clonado na imagem). - Binários instalados do PostgreSQL:
/usr/local/pgsql. - Dados (cluster):
/db/data(volume nomeadopgdata). - Workspace do curso:
/workspace(bind mount./). - Dotfiles do shell: bind mount
./dotfiles→/workspace/dotfiles.
Volumes / mounts principais (ver docker-compose.yml):
./:/workspace- Código do curso, scripts, logs etc.
- Logs importantes vão para
./logs:pg_configure.log,pg_make.log,pg_make_check.log,pg_make_install.logpg_buffercache_make.log,pg_buffercache_make_install.logpg_initdb.logpg_buffercache_create_extension.log
pgdata:/db/data- Cluster de dados inicializado com
initdb -D /db/data.
- Cluster de dados inicializado com
./dotfiles:/workspace/dotfiles- Configurações de zsh/Oh My Zsh/p10k, tanto para
alunoquanto pararoot.
- Configurações de zsh/Oh My Zsh/p10k, tanto para
Os scripts do container são montados via bind para facilitar ajustes sem rebuild:
./scripts/entrypoint.sh:/usr/local/bin/entrypoint.sh:ro./scripts/build-postgres.sh:/usr/local/bin/build-postgres.sh:ro
root- PID 1 / dono da maior parte do sistema.
postgres- Dono do diretório de dados
/db/data. - Roda o servidor PostgreSQL e
initdb. .bashrcconfigurado com:PATH=$PATH:/usr/local/pgsql/bin:$HOME/binPGDATA=/db/data
- Dono do diretório de dados
aluno- Usuário interativo para o curso.
- Tem acesso ao
/workspacee ao código‑fonte do PostgreSQL.
Diretórios principais:
/usr/local/src/postgres-15— código‑fonte do PostgreSQL 15.2 (git clone)./usr/local/pgsql— instalação dos binários (make install)./db/data— cluster de dados./workspace— diretório de trabalho (pasta do projeto)./workspace/logs— logs do build e initdb./workspace/dotfiles— dotfiles persistentes de zsh.
O ENTRYPOINT é scripts/entrypoint.sh e faz:
-
Dotfiles (zsh)
- Copia defaults de
/usr/local/share/dotfiles-defaultspara./dotfilesna primeira execução. - Cria symlinks na home de
alunoerootapontando para/workspace/dotfiles.
- Copia defaults de
-
Build automático do PostgreSQL (se necessário)
- Se
/usr/local/pgsql/bin/postgresnão existir, chama:/usr/local/bin/build-postgres.sh
- O script de build:
- Roda como root, mas chama
su - alunopara:./configure --prefix=/usr/local/pgsqlmakemake check
- Roda como root:
make installmakeemake installemcontrib/pg_buffercache
- Registra logs em:
logs/pg_configure.loglogs/pg_make.loglogs/pg_make_check.loglogs/pg_make_install.loglogs/pg_buffercache_make.loglogs/pg_buffercache_make_install.log
- Roda como root, mas chama
- Se
-
Inicialização do cluster (
initdb)- Diretório de dados:
/db/data. - Se não existir
PG_VERSIONem/db/data:- Executa como
postgres:initdb -D /db/data
- Log em
logs/pg_initdb.log.
- Executa como
- Diretório de dados:
-
Start do servidor
- Ajusta
PATHeLD_LIBRARY_PATH. - Executa como
postgres:pg_ctl -w -D /db/data -l /db/data/logfile start
- Log do servidor em
/db/data/logfile.
- Ajusta
-
Criação automática da extensão
pg_buffercache- Após o servidor estar online, executa como
postgres:psql -d postgres -c 'CREATE EXTENSION IF NOT EXISTS pg_buffercache;'
- Força
PATH=/usr/local/pgsql/bin:$PATHno comando. - Log em
logs/pg_buffercache_create_extension.log.
- Após o servidor estar online, executa como
-
Shell interativo
- No final, troca para o usuário
aluno:exec su - aluno -c "/usr/bin/zsh -l"
- No final, troca para o usuário
-
Build da imagem e start:
docker compose up -d --build
-
Start sem rebuild:
docker compose up -d
-
Parar containers (preserva volume
pgdata):docker compose down
-
Parar containers + remover volumes nomeados (inclui dados do cluster):
docker compose down -v
-
Entrar como
aluno(zsh):docker compose exec pg-build zsh -l -
Entrar como
postgres:docker compose exec pg-build bash -lc 'su - postgres'
-
Logs do container:
docker compose logs -f pg-build
-
Logs de build/init/extensão no host:
ls -l logs sed -n '1,40p' logs/pg_configure.log sed -n '1,40p' logs/pg_make_check.log sed -n '1,40p' logs/pg_initdb.log sed -n '1,40p' logs/pg_buffercache_create_extension.log
-
Rodar entrypoint manualmente (em um container já em execução):
docker compose exec pg-build /usr/local/bin/entrypoint.sh /usr/bin/true -
Rodar build manualmente:
docker compose exec pg-build bash -lc '/usr/local/bin/build-postgres.sh'
- Na primeira execução, o entrypoint copia as configs padrão de zsh/p10k para
./dotfiles. - São criados symlinks nas homes:
~aluno/.zshrc→/workspace/dotfiles/...~root/.zshrc→/workspace/dotfiles/...
- Qualquer alteração do shell (por exemplo,
p10k configure) é salva em./dotfiles, persistindo entre recriações do container.
- Docker e Docker Compose v2.
- No host, configurar o terminal com uma Nerd Font (por exemplo, MesloLGS NF) para ver os ícones do powerlevel10k.
Dockerfile— imagem base, usuários, dependências, clone do PostgreSQL, zsh etc.docker-compose.yml— definição do serviço, volumes, networks, binds de scripts.scripts/entrypoint.sh— lógica de:- dotfiles,
- build automático,
- initdb,
- start do servidor,
- criação da extensão
pg_buffercache, - troca para o usuário
aluno.
scripts/build-postgres.sh— build e instalação do PostgreSQL +pg_buffercache.logs/*.log— todos os logs relevantes do build, initdb e extensão..env— configuraPROJECT_NAME,IMAGE_TAGe timezone (TZ).
- Fontes instaladas dentro do container não mudam a fonte do terminal host.
Configure a fonte do seu terminal (host) para MesloLGS NF ou outra Nerd Font. - Os binários compilados são específicos da arquitetura/ABI da imagem base (Debian bookworm x86_64).
- Como
entrypoint.shebuild-postgres.shsão bind mounts, alterações nesses scripts não exigem rebuild da imagem — bastadocker compose restart pg-build.