Estou usando builder.AddPostgres().WithImage(...)
, mas a imagem tem esse comportamento de sair se eu não usar -it
ao fazerdocker run
é assim que a documentação diz para usar esta imagem:
docker run \
-it \
-v postgresml_data:/var/lib/postgresql \
-p 5433:5432 \
-p 8000:8000 \
ghcr.io/postgresml/postgresml:2.7.12 \
sudo -u postgresml psql -d postgresml
é assim que adiciono o postgres, mas o seed não funciona, o item é mostrado no painel como encerrado e no docker se eu pressionar o botão de reprodução ele simplesmente inicia e sai em menos de um minuto, que é a maneira correta de manter o contêiner em execução.
postgres = builder.AddPostgres("lcommerce-dependecy-postgres", port: 5432)
.WithImage("postgresml/postgresml")
.WithImageTag("2.9.3")
.WithImageRegistry("ghcr.io")
.WithHttpEndpoint(name: "endpoint-55432-5432",
port: 8000, targetPort: 8000, isProxied: true)
.WithContainerRuntimeArgs("-it", "--gpus=all");
Tentei manter o contêiner em execução usando, .WithContainerRuntimeArgs("-it", "--gpus=all")
mas continuo saindo. (por padrão, o net aspire adiciona usuário e senha do postgres. Já testei outra imagem pgvector/pgvector
e funciona bem, mas esta não sai por padrão)
ATUALIZAR
VOCÊ PODE USAR
.WithContainerRuntimeArgs("-i", "--gpus=all")
.WithArgs("sudo", "-u", "postgresml", "psql", "-d", "postgresml")
MAS O MELHOR É
(como a resposta sugere):
.WithContainerRuntimeArgs("--gpus=all")
.WithArgs( "sleep","infinity")
O CORRETO É
Crie uma imagem personalizada com a extensão e os módulos necessários e defina o servidor de banco de dados como o principal processo persistente em vez de usar uma solução alternativa (como a resposta mencionou)
O Dockerfile dessa imagem está disponível publicamente. Ele tem alguns problemas significativos de design. Mais notavelmente, ele não executa o servidor de banco de dados como o processo principal do contêiner, mas depende de algum outro processo em execução para "manter o contêiner ativo", algo que você nunca deveria precisar fazer. Um hackaround típico para isso é executar um
sleep
comando sem sentido. Isso provavelmente se parece com algo comoO que está acontecendo internamente? A imagem declara
(normalmente você deve apenas executar
script
, nãobash script
) sem umCMD
. Asentrypoint.sh
chamadasservice postgresql start
(service
geralmente não funcionam no Docker e um contêiner normalmente executa apenas um processo), executa váriossudo -u postgresml
comandos (sudo
é difícil de usar e quase sempre desnecessário no Docker) e finalmente termina comO Docker passa o
CMD
como argumentos para oENTRYPOINT
, mas na configuração padrãoCMD
está vazio. Ele rodaexec
sem argumentos, o que não faz nada, e o script sai. Como o script é o processo principal do contêiner, quando o script sai, o contêiner sai também.A página de imagem do Docker Hub
postgres
aponta para a imagem PostGIS como uma maneira mais típica de construir uma imagem PostgreSQL mais uma extensão. Baixe a extensão propriamente dita (o Dockerfile PostgresML usa APT para obtê-la, o que deve ser bom), coloque osCREATE EXTENSION
comandos SQL relevantes em um script em/docker-entrypoint-initdb.d
e deixe a inicialização normal pela primeira vez configurar a extensão. Para esta extensão em particular, você precisaria adicionar CUDA em cima de uma imagem PostgreSQL em vez de vice-versa , mas a configuração padrão da imagem do banco de dados é meio complicada e pode ser melhor reutilizá-la.