wip: Docker file
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
|||||||
|
# FROM debian:bullseye-slim
|
||||||
|
# FROM
|
||||||
|
FROM alpine:latest
|
||||||
|
# FROM scratch
|
||||||
|
|
||||||
|
# DOCKER_GUID=1000 \
|
||||||
|
# DOCKER_UID=1000 \
|
||||||
|
# DOCKER_TIME_CONT=America \
|
||||||
|
# DOCKER_TIME_CITY=New_York \
|
||||||
|
# ARG DOCKER_APP_USER=oxker \
|
||||||
|
# DOCKER_APP_GROUP=docker
|
||||||
|
|
||||||
|
# ENV TZ=${DOCKER_TIME_CONT}/${DOCKER_TIME_CITY}
|
||||||
|
|
||||||
|
# RUN apt-get update \
|
||||||
|
# && apt-get install -y ca-certificates wget \
|
||||||
|
# && update-ca-certificates \
|
||||||
|
# RUN groupadd ${DOCKER_APP_GROUP}
|
||||||
|
# RUN useradd --no-create-home --no-log-init ${DOCKER_APP_USER}
|
||||||
|
# && mkdir /healthcheck /logs \
|
||||||
|
# && chown ${DOCKER_APP_USER}:${DOCKER_APP_GROUP} /logs
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# COPY --chown=${DOCKER_APP_USER}:${DOCKER_APP_GROUP} docker/healthcheck/health_api.sh /healthcheck
|
||||||
|
|
||||||
|
# Copy from local release destination
|
||||||
|
# COPY --chown=${DOCKER_APP_USER} target/release/oxker /app/
|
||||||
|
# COPY target/release/oxker .
|
||||||
|
# RUN mkdir app
|
||||||
|
COPY /target/x86_64-unknown-linux-musl/release/oxker ./
|
||||||
|
COPY ./start_oxker.sh ./
|
||||||
|
RUN chmod +x /app/start_oxker.sh
|
||||||
|
|
||||||
|
# Use an unprivileged user
|
||||||
|
# USER ${DOCKER_APP_USER}
|
||||||
|
ENV RUST_BACKTRACE=full
|
||||||
|
# ENTRYPOINT ["./oxker" ]
|
||||||
|
# CMD [ "./oxker"]
|
||||||
|
ENTRYPOINT ["/app/start_oxker.sh"]
|
||||||
|
|
||||||
|
# docker run --rm -ti \
|
||||||
|
# --name=ctop \
|
||||||
|
# --volume /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||||
|
# # quay.io/vektorlab/ctop:latest
|
||||||
|
|
||||||
|
|
||||||
|
# docker run --rm -it --volume /var/run/docker.sock:/var/run/docker.sock:ro oxker
|
||||||
|
|
||||||
|
# docker run --rm -it --volume /var/run/docker.sock:/var/run/docker.sock:ro ghcr.io/mrjackwills/oxker:latest
|
||||||
|
# could get arch, and then download appropoatley from github?
|
||||||
|
|
||||||
|
# FROM rust:latest as cargo-build
|
||||||
|
|
||||||
|
# WORKDIR /build
|
||||||
|
# ENV RUSTFLAGS="-C target-feature=+crt-static"
|
||||||
|
|
||||||
|
# COPY Cargo* ./build
|
||||||
|
# COPY src/ ./build
|
||||||
|
|
||||||
|
# RUN cargo build --release --target x86_64-unknown-linux-gnu
|
||||||
|
|
||||||
|
# #####################################
|
||||||
|
|
||||||
|
|
||||||
|
# #####################################
|
||||||
|
|
||||||
|
# FROM scratch
|
||||||
|
|
||||||
|
# COPY --from=cargo-build /build/target/x86_64-unknown-linux-gnu/release/oxker /oxker
|
||||||
|
|
||||||
|
# ENTRYPOINT [ "/oxker" ]
|
||||||
|
|
||||||
|
# FROM rust:latest AS build
|
||||||
|
# WORKDIR /oxker_build
|
||||||
|
|
||||||
|
# # Download the target for static linking.
|
||||||
|
# RUN rustup target add x86_64-unknown-linux-musl
|
||||||
|
|
||||||
|
# # Create a dummy project and build the app's dependencies.
|
||||||
|
# # If the Cargo.toml or Cargo.lock files have not changed,
|
||||||
|
# # we can use the docker build cache and skip these (typically slow) steps.
|
||||||
|
# RUN USER=root cargo new oxker --bin
|
||||||
|
# WORKDIR /oxker_build
|
||||||
|
# COPY Cargo.toml Cargo.lock ./
|
||||||
|
# # CMD ["sleep", "6000"]
|
||||||
|
|
||||||
|
# # RUN cargo build --release
|
||||||
|
|
||||||
|
# # Copy the source and build the application.
|
||||||
|
# COPY src ./src/
|
||||||
|
# RUN cargo install --target x86_64-unknown-linux-musl --path .
|
||||||
|
|
||||||
|
# # Copy the statically-linked binary into a scratch container.
|
||||||
|
# FROM scratch
|
||||||
|
# COPY --from=build /oxker_build/bin/oxker .
|
||||||
|
# # USER 1000
|
||||||
|
# CMD ["./oxker"]
|
||||||
|
|
||||||
|
# cross build --target x86_64-unknown-linux-musl --release
|
||||||
|
|
||||||
|
# rustup target add x86_64-unknown-linux-musl
|
||||||
|
# cargo build --release --target=x86_64-unknown-linux-musl
|
||||||
@@ -27,7 +27,6 @@ Now published on <a href='https://www.crates.io/crates/oxker' target='_blank' re
|
|||||||
|
|
||||||
```cargo install oxker```
|
```cargo install oxker```
|
||||||
|
|
||||||
|
|
||||||
else see the <a href="https://github.com/mrjackwills/oxker/releases/latest" target='_blank' rel='noopener noreferrer'>pre-built binaries</a>
|
else see the <a href="https://github.com/mrjackwills/oxker/releases/latest" target='_blank' rel='noopener noreferrer'>pre-built binaries</a>
|
||||||
|
|
||||||
or, download & install (x86_64 one liner)
|
or, download & install (x86_64 one liner)
|
||||||
@@ -107,11 +106,8 @@ using docker-compose.yml;
|
|||||||
|
|
||||||
or individually
|
or individually
|
||||||
|
|
||||||
|
|
||||||
```docker run --name redis -d redis:alpine3.16```
|
```docker run --name redis -d redis:alpine3.16```
|
||||||
|
|
||||||
```docker run --name postgres -e POSTGRES_PASSWORD=never_use_this_password_in_production -d postgres:alpine3.16```
|
```docker run --name postgres -e POSTGRES_PASSWORD=never_use_this_password_in_production -d postgres:alpine3.16```
|
||||||
|
|
||||||
```docker run -d --hostname my-rabbit --name rabbitmq rabbitmq:3```
|
```docker run -d --hostname my-rabbit --name rabbitmq rabbitmq:3```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,20 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<String> for State {
|
||||||
|
fn from(input: String) -> Self {
|
||||||
|
match input.as_ref() {
|
||||||
|
"dead" => Self::Dead,
|
||||||
|
"exited" => Self::Exited,
|
||||||
|
"paused" => Self::Paused,
|
||||||
|
"removing" => Self::Removing,
|
||||||
|
"restarting" => Self::Restarting,
|
||||||
|
"running" => Self::Running,
|
||||||
|
_ => Self::Unknown,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<&str> for State {
|
impl From<&str> for State {
|
||||||
fn from(input: &str) -> Self {
|
fn from(input: &str) -> Self {
|
||||||
match input {
|
match input {
|
||||||
|
|||||||
+20
-22
@@ -313,7 +313,9 @@ impl AppData {
|
|||||||
/// So can display nicely and evenly
|
/// So can display nicely and evenly
|
||||||
pub fn get_width(&self) -> Columns {
|
pub fn get_width(&self) -> Columns {
|
||||||
let mut output = Columns::new();
|
let mut output = Columns::new();
|
||||||
|
// Think this is causing issues
|
||||||
let count = |x: &String| x.chars().count();
|
let count = |x: &String| x.chars().count();
|
||||||
|
// let count = |_:&String|10;
|
||||||
|
|
||||||
for container in &self.containers.items {
|
for container in &self.containers.items {
|
||||||
let cpu_count = count(
|
let cpu_count = count(
|
||||||
@@ -437,27 +439,21 @@ impl AppData {
|
|||||||
|
|
||||||
for i in containers.iter() {
|
for i in containers.iter() {
|
||||||
if let Some(id) = i.id.as_ref() {
|
if let Some(id) = i.id.as_ref() {
|
||||||
let mut name = i
|
// maybe if no name then continue?
|
||||||
.names
|
let name = i.names.as_ref().map_or("".to_owned(), |f|f.get(0).map_or("".to_owned(), |f|f.clone()));
|
||||||
.as_ref()
|
// if let Some(c) = name.chars().next() {
|
||||||
.unwrap_or(&vec!["".to_owned()])
|
// if c == '/' {
|
||||||
.get(0)
|
// name.remove(0);
|
||||||
.unwrap_or(&String::from(""))
|
// }
|
||||||
.clone();
|
// }
|
||||||
if let Some(c) = name.chars().next() {
|
|
||||||
if c == '/' {
|
let state = State::from(i.state.as_ref().map_or("dead".to_owned(), |f|f.trim().to_owned()));
|
||||||
name.remove(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
let status = i.status.as_ref().map_or("".to_owned(), |f| f.trim().to_owned());
|
||||||
|
let image = i.image.as_ref().map_or("".to_owned(), |f|f.clone());
|
||||||
|
|
||||||
let state = State::from(i.state.as_ref().unwrap_or(&"dead".to_owned()).trim());
|
|
||||||
let status = i
|
|
||||||
.status
|
|
||||||
.as_ref()
|
|
||||||
.unwrap_or(&"".to_owned())
|
|
||||||
.trim()
|
|
||||||
.to_owned();
|
|
||||||
let image = i.image.as_ref().unwrap_or(&"".to_owned()).trim().to_owned();
|
|
||||||
if let Some(current_container) = self.get_container_by_id(id) {
|
if let Some(current_container) = self.get_container_by_id(id) {
|
||||||
if current_container.name != name {
|
if current_container.name != name {
|
||||||
current_container.name = name;
|
current_container.name = name;
|
||||||
@@ -478,10 +474,12 @@ impl AppData {
|
|||||||
current_container.state = state;
|
current_container.state = state;
|
||||||
};
|
};
|
||||||
if current_container.image != image {
|
if current_container.image != image {
|
||||||
current_container.image = image.chars().into_iter().take(64).collect();
|
// current_container.image = image.chars().into_iter().take(64).collect();
|
||||||
|
current_container.image = image;
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
let mut container = ContainerItem::new(id.clone(), status, image.chars().into_iter().take(64).collect(), state, name);
|
// let mut container = ContainerItem::new(id.clone(), status, image.chars().into_iter().take(64).collect(), state, name);
|
||||||
|
let mut container = ContainerItem::new(id.clone(), status, image, state, name);
|
||||||
container.logs.end();
|
container.logs.end();
|
||||||
self.containers.items.push(container);
|
self.containers.items.push(container);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ use ui::{create_ui, GuiState};
|
|||||||
|
|
||||||
fn setup_tracing() {
|
fn setup_tracing() {
|
||||||
tracing_subscriber::fmt().with_max_level(Level::INFO).init();
|
tracing_subscriber::fmt().with_max_level(Level::INFO).init();
|
||||||
|
// TODO write to file?
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ pub mod log_sanitizer {
|
|||||||
text::{Span, Spans},
|
text::{Span, Spans},
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Attempt to colorize the given string to tui-rs standars
|
/// Attempt to colorize the given string to tui-rs standards
|
||||||
pub fn colorize_logs(input: &str) -> Vec<Spans<'static>> {
|
pub fn colorize_logs(input: &str) -> Vec<Spans<'static>> {
|
||||||
vec![Spans::from(
|
vec![Spans::from(
|
||||||
categorise_text(input)
|
categorise_text(input)
|
||||||
|
|||||||
@@ -169,9 +169,6 @@ impl SelectablePanel {
|
|||||||
/// Global gui_state, stored in an Arc<Mutex>
|
/// Global gui_state, stored in an Arc<Mutex>
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct GuiState {
|
pub struct GuiState {
|
||||||
// Think this should be a BMapTree, so can define order when iterating over potential intersects
|
|
||||||
// Is an issue if two panels are in the same space, sush as a smaller panel embedded, yet infront of, a larger panel
|
|
||||||
// If a BMapTree think it would mean have to implement ordering for SelectablePanel
|
|
||||||
panel_map: HashMap<SelectablePanel, Rect>,
|
panel_map: HashMap<SelectablePanel, Rect>,
|
||||||
heading_map: HashMap<Header, Rect>,
|
heading_map: HashMap<Header, Rect>,
|
||||||
loading_icon: Loading,
|
loading_icon: Loading,
|
||||||
|
|||||||
Executable
+7
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# No idea why this is sloving my issue, or even where the issue is originally coming from
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
exec ./oxker "$@"
|
||||||
Reference in New Issue
Block a user