Quero executar a imagem docker do Ollama. Isso expõe a API inteira com seus endpoints.
Quero protegê-lo adicionando um proxy reverso e escolhi o Nginx para o trabalho.
Então preciso adicionar o Nginx à minha imagem do docker com o Ollama.
Então eu construí o seguinte Dockerfile:
FROM ollama/ollama:latest
FROM nginx:latest
COPY /.nginx/nginx.conf /etc/nginx/conf.d/default.conf
Minha configuração Nginx:
server {
listen 80;
location /api/tags {
proxy_pass http://localhost:11434/api/tags;
proxy_set_header Host localhost:11434;
}
# Default: Return 404 for all other endpoints
location / {
return 404;
}
}
Aqui, permito que apenas um ponto de extremidade seja proxy para Ollama.
Para testar, testei alguns endpoints e eles retornaram corretamente 404.
Mas quando tentei api/tags
o caminho, recebi o erro 502 "Gateway inválido".
Nos logs do docker eu pude ver:
2024-12-01 22:44:41 2024/12/01 21:44:41 [aviso] 29#29: *1 servidor upstream desabilitado temporariamente durante a conexão com o upstream, cliente: 172.17.0.1, servidor: , solicitação: "GET /api/tags HTTP/1.1", upstream: "http://127.0.0.1:11434/api/tags", host: "localhost:8000"
2024-12-01 22:44:41 2024/12/01 21:44:41 [erro] 29#29: *1 connect() falhou (111: Conexão recusada) ao conectar ao upstream, cliente: 172.17.0.1, servidor: , solicitação: "GET /api/tags HTTP/1.1", upstream: "http://127.0.0.1:11434/api/tags", host: "localhost:8000"
2024-12-01 22:44:41 2024/12/01 21:44:41 [aviso] 29#29: *1 servidor upstream desabilitado temporariamente durante a conexão com o upstream, cliente: 172.17.0.1, servidor: , solicitação: "GET /api/tags HTTP/1.1", upstream: "http://127.0.0.1:11434/api/tags", host: "localhost:8000"
2024-12-01 22:44:41 172.17.0.1 - - [01/Dez/2024:21:44:41 +0000] "GET /api/tags HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/128.0.0.0 Safari/537.36 OPR/114.0.0.0" "-"
Parece que o servidor Ollama não está funcionando, mas não sei:
- Como verificar processos em execução no Docker,
ps
comando não encontrado no Docker. - Como executar o servidor Ollama?
- Como definir no Docker como iniciar o servidor Ollama automaticamente?
Você não pode criar uma imagem Docker contendo vários programas da forma como está tentando. O Dockerfile que você tem resultará em uma imagem que contém apenas Nginx e não Ollama. Também é geralmente recomendado ter apenas um processo em execução em um contêiner.
Eu recomendaria executar o Ollama e o Nginx em seus próprios contêineres e orquestrá-los usando o Docker Compose.
Crie um
docker-compose.yml
arquivo contendoEm seguida, altere seu arquivo nginx.conf para que ele passe a solicitação ao contêiner Ollama usando o
ollama
nome do serviço em vez delocalhost
algo assim:Seu Dockerfile funcionará como está, já que a primeira linha é efetivamente ignorada. Mas para manter as coisas organizadas, você deve alterá-lo para
docker compose up -d
iniciará ambos os contêineres. Quando uma solicitação chega ao Nginx,http://localhost/api/tags
ele a passa para o contêiner Ollama na/api/tags
porta 11434.Acho que o principal problema é que o Dockerfile e a configuração atual não permitem que ambos os serviços (Ollama e Nginx) sejam iniciados simultaneamente.
Por que ?
(1) Dockerfile incompleto
O original contém apenas:
Este Dockerfile não especifica como iniciar os serviços ou como eles irão interagir entre si.
(2) Os registros são claros sobre isso
Nos logs fornecidos, erros de conexão claros são visíveis:
Este erro indica que o Nginx não consegue se conectar ao Ollama, sugerindo que o serviço Ollama não foi iniciado ou não está acessível.