我有一个 rust Axum 应用程序,它一开始就读取数据库 URL 来创建数据库连接:
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");
问题是它没有获取环境变量。db_connection_str
是空的,我println
在控制台中得到了“连接到数据库:”而没有实际值。
这是 dockerfile
FROM rust:1.84 AS development
WORKDIR /backend
COPY . .
ARG DATABASE_URL
ENV DATABASE_URL=$DATABASE_URL
RUN cargo run
这是 docker-compose 文件
backend:
build: ./backend
ports:
- "5173:5173"
environment:
DATABASE_URL: $DATABASE_URL
我有一个.env
环境变量文件。
注意:当我运行此命令时
docker build -t backend --build-arg DATABASE_URL=<Database_url> .
它可以运行,并且可以获取环境变量,但是当我运行docker-compose up
它时却没有,并且发生了上述问题。
您没有指定在运行时运行的命令。
您的
RUN cargo run
代码在构建时运行,这似乎是错误的。它应该是类似这样的CMD cargo run
代码,这样它就会在运行时运行。试试这个:顺序不对。
在构建容器时,您正在设置嵌入到容器映像中的环境变量。但是 Dockerfile 中的 ARG 行允许在容器运行时指定环境变量。因此,您在 docker 构建时指定的值只是默认值。
现在,在您的 docker-compose 文件中,您不仅可以启动容器,还可以指定环境变量。但它有什么值?可以
$DATABASE_URL
解析 docker-compose 吗?作为测试,我要么放置一个文字值来覆盖,要么完全删除该变量以允许容器使用它的默认值。