Tenho um aplicativo Rust Axum que lê a URL do banco de dados logo no início para criar uma conexão com o banco de dados:
async fn main() {
let db_connection_str = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set.");
println!("Connecting to database: {}", db_connection_str);
let pool = PgPoolOptions::new()
.max_connections(5)
.acquire_timeout(Duration::from_secs(3))
.connect(&db_connection_str)
.await
.expect("can't connect to database");
O problema é que não está obtendo a variável de ambiente. db_connection_str
está vazio, e recebo isso println
no console "Conectando ao banco de dados: " sem o valor real.
este é o dockerfile
FROM rust:1.84 AS development
WORKDIR /backend
COPY . .
ARG DATABASE_URL
ENV DATABASE_URL=$DATABASE_URL
RUN cargo run
E aqui está o arquivo docker-compose
backend:
build: ./backend
ports:
- "5173:5173"
environment:
DATABASE_URL: $DATABASE_URL
Tenho um .env
arquivo para variáveis de ambiente.
Nota: Quando executo este comando
docker build -t backend --build-arg DATABASE_URL=<Database_url> .
funciona, obtém a variável de ambiente, mas quando executo docker-compose up
não, e o problema mencionado acima acontece.
Você não especifica um comando para ser executado em tempo de execução.
O seu
RUN cargo run
é executado em tempo de construção e isso parece errado. Deveria ser algo comoCMD cargo run
instead, para que ele fosse executado em tempo de execução. Tente isto:A sequência não está correta.
Ao construir seu contêiner, você está definindo a variável de ambiente que é assada na imagem do contêiner. Mas a linha ARG no seu Dockerfile permite que a variável de ambiente seja especificada no tempo de execução do contêiner. Como efeito, o valor que você especificou durante o tempo de construção do docker é apenas um padrão.
Agora, no seu arquivo docker-compose, você não apenas inicia o contêiner, mas também especifica a variável de ambiente. Mas qual valor ele tem? É
$DATABASE_URL
resolvível para docker-compose?Como teste, eu colocaria um valor literal para substituir ou removeria essa variável completamente para permitir que o contêiner usasse seu padrão.