Very large docker image size optimisations

without cross compiling to linux-musl, optimise image by compiling it on a slim rust image and then transferring only the binary over to a debian-slim image.
This commit is contained in:
Nick Bland 2021-11-16 15:40:32 +10:00
parent b279578b51
commit 0a31ae482b
No known key found for this signature in database
GPG Key ID: B46CF88E4DAB4A2C
4 changed files with 27 additions and 10 deletions

View File

@ -1,5 +1,8 @@
target target/
.vscode .vscode
tests tests/
.git .git
.gitignore .gitignore
.env
Dockerfile
migrations/

View File

@ -1,11 +1,21 @@
FROM rust:1.56 FROM rust:1.56-slim AS builder
WORKDIR /app WORKDIR /app
COPY . . COPY . .
ENV SQLX_OFFLINE true ENV SQLX_OFFLINE true
RUN cargo build --release RUN cargo build --release
FROM debian:bullseye-slim AS runtime
WORKDIR /app
# Install dependancies required
RUN apt update -y && apt install -y --no-install-recommends openssl && apt autoremove -y && apt clean -y && rm -rf /var/lib/apt/lists/*
# Copy the fully built binary and configuration to the image
COPY --from=builder /app/target/release/mail_app mail_app
COPY configuration configuration
ENV APP_ENVIRONMENT production ENV APP_ENVIRONMENT production
ENTRYPOINT ["./target/release/mail_app"] ENTRYPOINT ["./mail_app"]

View File

@ -1,8 +1,10 @@
use std::net::TcpListener;
use sqlx::PgPool;
use sqlx::postgres::PgPoolOptions;
use mail_app::startup::run; use mail_app::startup::run;
use mail_app::configuration::get_configuration; use mail_app::configuration::get_configuration;
use mail_app::telemetry::{get_subscriber, init_subscriber}; use mail_app::telemetry::{get_subscriber, init_subscriber};
use std::net::TcpListener;
use sqlx::PgPool;
#[actix_web::main] #[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> std::io::Result<()> {
@ -13,7 +15,9 @@ async fn main() -> std::io::Result<()> {
let configuration = get_configuration().expect("Failed to read configuration data."); let configuration = get_configuration().expect("Failed to read configuration data.");
// Configure connection to database for our startup // Configure connection to database for our startup
let connection_pool = PgPool::connect_lazy(&configuration.database.connection_string()) let connection_pool = PgPool::new()
.connect_timeout(std::time::Duration::from_secs(2))
.connect(&configuration.database.connection_string())
.expect("Failed to connect to Postgres."); .expect("Failed to connect to Postgres.");
// Take port from settings file // Take port from settings file

View File

@ -1,6 +1,6 @@
use actix_web::{web, App, HttpServer}; use actix_web::{web, App, HttpServer};
use actix_web::dev::Server; use actix_web::dev::Server;
use actix_web::web::Data; // use actix_web::web::Data;
use std::net::TcpListener; use std::net::TcpListener;
use sqlx::PgPool; use sqlx::PgPool;
use tracing_actix_web::TracingLogger; use tracing_actix_web::TracingLogger;