Docker env #34

Closed
phoenix wants to merge 6 commits from docker_env into devel
9 changed files with 46 additions and 11 deletions

2
.dockerignore Normal file
View File

@@ -0,0 +1,2 @@
.env
!/.env.docker

View File

@@ -8,7 +8,10 @@ pkg/
.gitea/ .gitea/
# Ignore environment files (configure via docker-compose instead) # Ignore environment files (configure via docker-compose instead)
.env* .env
.env.sample
.env.docker
.env.docker.sample
# Ignore IDE/editor specific files # Ignore IDE/editor specific files
.idea/ .idea/

6
.env.docker.sample Normal file
View File

@@ -0,0 +1,6 @@
SECRET_KEY=refero34o8rfhfjn983thf39fhc943rf923n3h
POSTGRES_USER=icarus_op_test
POSTGRES_PASSWORD=password
POSTGRES_DB=icarus_auth_test_db
POSTGRES_HOST=auth_db
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/${POSTGRES_DB}

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
/target /target
Cargo.lock Cargo.lock
.env .env
.env.docker

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "icarus_auth" name = "icarus_auth"
version = "0.3.4" version = "0.3.6"
edition = "2024" edition = "2024"
rust-version = "1.86" rust-version = "1.86"

View File

@@ -34,9 +34,14 @@ RUN --mount=type=ssh mkdir src && \
# Copy the actual source code # Copy the actual source code
COPY src ./src COPY src ./src
# If you have other directories like `templates` or `static`, copy them too # If you have other directories like `templates` or `static`, copy them too
COPY .env ./.env COPY .env.docker ./.env.docker
COPY migrations ./migrations COPY migrations ./migrations
# Explicitly expose the env var
# ENV DATABASE_URL=${DATABASE_URL}
ARG ENV_FILE=.env.docker
COPY ${ENV_FILE} ./.env.docker
# << --- SSH MOUNT ADDED HERE --- >> # << --- SSH MOUNT ADDED HERE --- >>
# Build *only* dependencies to leverage Docker cache # Build *only* dependencies to leverage Docker cache
# This dummy build caches dependencies as a separate layer # This dummy build caches dependencies as a separate layer
@@ -60,7 +65,7 @@ COPY --from=builder /usr/src/app/target/release/icarus_auth .
# Copy other necessary files like .env (if used for runtime config) or static assets # Copy other necessary files like .env (if used for runtime config) or static assets
# It's generally better to configure via environment variables in Docker though # It's generally better to configure via environment variables in Docker though
COPY --from=builder /usr/src/app/.env . COPY --from=builder /usr/src/app/.env.docker .
COPY --from=builder /usr/src/app/migrations ./migrations COPY --from=builder /usr/src/app/migrations ./migrations
# Expose the port your Axum app listens on (e.g., 3000 or 8000) # Expose the port your Axum app listens on (e.g., 3000 or 8000)

View File

@@ -11,7 +11,9 @@ services:
# Map host port 8000 to container port 3000 (adjust as needed) # Map host port 8000 to container port 3000 (adjust as needed)
- "8000:3000" - "8000:3000"
env_file: env_file:
- .env - .env.docker
environment:
- DATABASE_URL=${DATABASE_URL}
depends_on: depends_on:
auth_db: auth_db:
condition: service_healthy # Wait for the DB to be healthy before starting the app condition: service_healthy # Wait for the DB to be healthy before starting the app

View File

@@ -19,7 +19,6 @@ mod connection_settings {
pub mod db { pub mod db {
use sqlx::postgres::PgPoolOptions; use sqlx::postgres::PgPoolOptions;
use std::env;
use crate::{connection_settings, keys}; use crate::{connection_settings, keys};
@@ -34,9 +33,25 @@ pub mod db {
} }
async fn get_db_url() -> String { async fn get_db_url() -> String {
#[cfg(debug_assertions)] // Example: Only load .env in debug builds // dotenvy::dotenv().ok();
dotenvy::dotenv().ok(); // dotenvy::from_filename(".env").ok();
env::var(keys::DBURL).expect(keys::error::ERROR) // env::var(keys::DBURL).expect(keys::error::ERROR)
/*
std::env::var(keys::DBURL)
.or_else(|_| {
dotenvy::dotenv().ok();
dotenvy::var(keys::DBURL)
})
.expect("DATABASE_URL must be set in environment or .env file")
*/
if let Err(_) = dotenvy::from_filename(".env.docker") {
eprintln!("Note: .env.docker not found, using system env vars");
dotenvy::dotenv().ok();
std::env::var(keys::DBURL).expect(keys::error::ERROR)
} else {
std::env::var(keys::DBURL).expect(keys::error::ERROR)
}
} }
pub async fn migrations(pool: &sqlx::PgPool) { pub async fn migrations(pool: &sqlx::PgPool) {

View File

@@ -74,6 +74,7 @@ mod tests {
pub const LIMIT: usize = 6; pub const LIMIT: usize = 6;
pub async fn get_pool() -> Result<sqlx::PgPool, sqlx::Error> { pub async fn get_pool() -> Result<sqlx::PgPool, sqlx::Error> {
dotenvy::dotenv().ok(); // Load .env file if it exists
let tm_db_url = std::env::var(keys::DBURL).expect("DATABASE_URL must be present"); let tm_db_url = std::env::var(keys::DBURL).expect("DATABASE_URL must be present");
let tm_options = sqlx::postgres::PgConnectOptions::from_str(&tm_db_url).unwrap(); let tm_options = sqlx::postgres::PgConnectOptions::from_str(&tm_db_url).unwrap();
sqlx::PgPool::connect_with(tm_options).await sqlx::PgPool::connect_with(tm_options).await