Eu tenho tentado configurar um contêiner para uma instância de desenvolvimento do postgres, criando um usuário e banco de dados personalizados. Estou usando a imagem oficial do postgres docker . Na documentação, ele instrui a inserir um script bash dentro da /docker-entrypoint-initdb.d/
pasta para configurar o banco de dados com quaisquer parâmetros personalizados.
Meu script bash: make_db.sh
su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"
Dockerfile
FROM library/postgres
RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/
O erro que recebo do docker logs -f db
(db é o nome do meu contêiner) é:
createuser: não foi possível conectar-se ao banco de dados postgres: não foi possível conectar-se ao servidor: esse arquivo ou diretório não existe
Parece que os comandos dentro da /docker-entrypoint-initdb.d/
pasta estão sendo executados antes do postgres ser iniciado. Minha pergunta é: como configuro um usuário / banco de dados programaticamente usando o contêiner oficial do postgres? Existe alguma maneira de fazer isso com um script?
fonte
gosu postgres postgres --single < /tmp/somefile.sql
psql -U myDb -d myDb -f myDb.sql
docker-entrypoint-initdb.d
vejo o meuinit.sql
com o código sql. MAS, quando abro o mysql (usando acesso root) e digito show database, vejo apenas o padrão nodocker-compose.yml
arquivo! Por que não está funcionando para mim?db.sql
mesmo depois de ser copiado para `janela de encaixe-entrypoint-initdb.d`Agora você pode colocar arquivos .sql dentro do diretório init:
Dos documentos
Portanto, copiar seu arquivo .sql funcionará.
fonte
Usando
docker-compose
:Supondo que você tenha o seguinte layout de diretório:
Arquivo:
docker-compose.yml
Arquivo:
Docker/init.sql
Arquivo:
Docker/db.Dockerfile
Serviços de composição e início:
fonte
Eu adiciono comandos personalizados a um ambiente evocado em um CMD após o início dos serviços ... Não o fiz no postgres, mas no Oracle:
e comece com
.
fonte
Você pode usar estes comandos:
fonte
ENCODING 'LATIN1'
é muito estranho ... Você deve ter necessidades muito particulares para evitar o uso utf8Você precisa ter o banco de dados em execução antes de criar os usuários. Para isso, você precisa de vários processos. Você pode iniciar o postgres em uma subshell (&) no script shell ou usar uma ferramenta como supervisord para executar o postgres e, em seguida, executar qualquer script de inicialização.
Um guia para supervisord e docker https://docs.docker.com/articles/using_supervisord/
fonte
Com o docker compor, há uma alternativa simples (não é necessário criar um arquivo Docker). Basta criar um init-database.sh:
E referencie-o na seção de volumes:
fonte