diff --git a/src/components/backend-core/Dockerfile b/src/components/backend-core/Dockerfile index 95c08486..40a8f5a8 100644 --- a/src/components/backend-core/Dockerfile +++ b/src/components/backend-core/Dockerfile @@ -1,11 +1,18 @@ +# syntax=docker/dockerfile:1.7 FROM rust:1-bookworm AS build WORKDIR /app/src/components/backend-core ARG CARGO_BUILD_JOBS=1 ENV CARGO_BUILD_JOBS=${CARGO_BUILD_JOBS} COPY src/components/backend-core/Cargo.toml ./Cargo.toml COPY src/components/backend-core/Cargo.lock ./Cargo.lock +RUN mkdir -p src \ + && printf 'fn main() {}\n' > src/main.rs \ + && cargo build --release --locked --jobs "${CARGO_BUILD_JOBS}" \ + && rm -rf src COPY src/components/backend-core/src ./src -RUN cargo build --release --jobs "${CARGO_BUILD_JOBS}" +RUN rm -f target/release/backend-core target/release/backend-core.d \ + && find target/release/.fingerprint -maxdepth 1 -type d -name 'unidesk-backend-core-*' -exec rm -rf {} + \ + && cargo build --release --locked --jobs "${CARGO_BUILD_JOBS}" FROM postgres:16-bookworm RUN apt-get update \ diff --git a/src/components/backend-core/src/cli.rs b/src/components/backend-core/src/cli.rs index b536fcbe..16d769a3 100644 --- a/src/components/backend-core/src/cli.rs +++ b/src/components/backend-core/src/cli.rs @@ -11,6 +11,18 @@ use tokio_tungstenite::tungstenite::Message; use crate::http::internal_fetch_json; +async fn write_stdout(bytes: &[u8]) { + let mut stdout = tokio::io::stdout(); + let _ = stdout.write_all(bytes).await; + let _ = stdout.flush().await; +} + +async fn write_stderr(bytes: &[u8]) { + let mut stderr = tokio::io::stderr(); + let _ = stderr.write_all(bytes).await; + let _ = stderr.flush().await; +} + pub async fn handle_cli() -> anyhow::Result { let mut args = env::args().skip(1).collect::>(); if args.is_empty() { @@ -171,16 +183,12 @@ async fn ssh_broker_cli(args: Vec) -> anyhow::Result<()> { loop { let message = tokio::select! { _ = &mut runtime_timer => { - let _ = tokio::io::stderr() - .write_all(format!("unidesk ssh bridge runtime timeout after {runtime_timeout_ms}ms\n").as_bytes()) - .await; + write_stderr(format!("unidesk ssh bridge runtime timeout after {runtime_timeout_ms}ms\n").as_bytes()).await; exit_code = 124; break; } _ = &mut open_timer, if !opened => { - let _ = tokio::io::stderr() - .write_all(format!("unidesk ssh bridge timed out waiting for provider session after {open_timeout_ms}ms\n").as_bytes()) - .await; + write_stderr(format!("unidesk ssh bridge timed out waiting for provider session after {open_timeout_ms}ms\n").as_bytes()).await; exit_code = 255; break; } @@ -207,13 +215,12 @@ async fn ssh_broker_cli(args: Vec) -> anyhow::Result<()> { .decode(data) .unwrap_or_default(); if parsed.get("stream").and_then(Value::as_str) == Some("stderr") { - let _ = tokio::io::stderr().write_all(&bytes).await; + write_stderr(&bytes).await; } else { - let _ = tokio::io::stdout().write_all(&bytes).await; + write_stdout(&bytes).await; } } "ssh.exit" => { - opened = true; exit_code = parsed .get("exitCode") .and_then(Value::as_i64) @@ -221,18 +228,17 @@ async fn ssh_broker_cli(args: Vec) -> anyhow::Result<()> { break; } "ssh.error" => { - let _ = tokio::io::stderr() - .write_all( - format!( - "{}\n", - parsed - .get("message") - .and_then(Value::as_str) - .unwrap_or("ssh error") - ) - .as_bytes(), + write_stderr( + format!( + "{}\n", + parsed + .get("message") + .and_then(Value::as_str) + .unwrap_or("ssh error") ) - .await; + .as_bytes(), + ) + .await; exit_code = 255; break; }