Added health etc
This commit is contained in:
18
example.toml
18
example.toml
@@ -5,6 +5,16 @@ name = "nc-test-api"
|
|||||||
image = "numberchords-api"
|
image = "numberchords-api"
|
||||||
network = "nc-network"
|
network = "nc-network"
|
||||||
depend = ["nc-test-database"]
|
depend = ["nc-test-database"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
detach = true
|
||||||
|
hostname = "nc-test-api-hn"
|
||||||
|
|
||||||
|
[service.healthcheck]
|
||||||
|
cmd = "pg_isready --dbname=$DB_DATABASE_NAME --username=$DB_USERNAME || exit 1"
|
||||||
|
interval = "5s"
|
||||||
|
start_period = "30s"
|
||||||
|
retries = 3
|
||||||
|
on_failure = "none"
|
||||||
|
|
||||||
[environment]
|
[environment]
|
||||||
ASPNETCORE_ENVIRONMENT = "Test"
|
ASPNETCORE_ENVIRONMENT = "Test"
|
||||||
@@ -28,4 +38,10 @@ container = 2222
|
|||||||
|
|
||||||
[[volumes]]
|
[[volumes]]
|
||||||
volume = "test"
|
volume = "test"
|
||||||
path = "/data/test"
|
path = "/data/test"
|
||||||
|
|
||||||
|
[[mounts]]
|
||||||
|
typ = "bind"
|
||||||
|
source = "/etc/hosts"
|
||||||
|
target = "/etc/hosts"
|
||||||
|
read_only = true
|
||||||
46
src/main.rs
46
src/main.rs
@@ -31,11 +31,27 @@ pub fn generate_openrc(config: &ServiceConfig) {
|
|||||||
// start()
|
// start()
|
||||||
script.push_str("start() {\n");
|
script.push_str("start() {\n");
|
||||||
|
|
||||||
let mut arguments = vec![String::from("--restart unless-stopped"), format!("--name {}", config.service.name)];
|
let mut arguments = vec![
|
||||||
|
format!("--restart {}", config.service.restart.as_deref().unwrap_or("unless-stopped")),
|
||||||
|
format!("--name {}", config.service.name)
|
||||||
|
];
|
||||||
|
|
||||||
|
if let Some(hostname) = &config.service.hostname {
|
||||||
|
arguments.push(format!("--hostname {}", hostname));
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.service.detach.unwrap_or(true) {
|
||||||
|
arguments.push("--detach".to_string());
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(network) = &config.service.network {
|
if let Some(network) = &config.service.network {
|
||||||
arguments.push(format!("--network {}", network));
|
arguments.push(format!("--network {}", network));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for capability in &config.capabilities {
|
||||||
|
arguments.push(format!("--cap-add {}", capability));
|
||||||
|
}
|
||||||
|
|
||||||
for secret in &config.secrets {
|
for secret in &config.secrets {
|
||||||
if let Some(target) = &secret.target {
|
if let Some(target) = &secret.target {
|
||||||
arguments.push(format!("--secret {},target={}", &secret.key, target));
|
arguments.push(format!("--secret {},target={}", &secret.key, target));
|
||||||
@@ -45,16 +61,40 @@ pub fn generate_openrc(config: &ServiceConfig) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (key, value) in &config.environment {
|
for (key, value) in &config.environment {
|
||||||
arguments.push(format!("--env {}={}", key, value));
|
arguments.push(format!("--env {}='{}'", key, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
for volume in &config.volumes {
|
for volume in &config.volumes {
|
||||||
arguments.push(format!("--volume {}:{}", &volume.volume, &volume.path));
|
arguments.push(format!("--volume {}:{}", &volume.volume, &volume.path));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for mount in &config.mounts {
|
||||||
|
let mut mount_str = format!("--mount type={},source={},target={}", mount.typ, mount.source, mount.target);
|
||||||
|
if mount.read_only.unwrap_or(false) {
|
||||||
|
mount_str.push_str(",readonly");
|
||||||
|
}
|
||||||
|
arguments.push(mount_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(healthcheck) = &config.service.healthcheck {
|
||||||
|
arguments.push(format!("--health-cmd '{}'", healthcheck.cmd));
|
||||||
|
if let Some(interval) = &healthcheck.interval {
|
||||||
|
arguments.push(format!("--health-interval {}", interval));
|
||||||
|
}
|
||||||
|
if let Some(start_period) = &healthcheck.start_period {
|
||||||
|
arguments.push(format!("--health-start-period {}", start_period));
|
||||||
|
}
|
||||||
|
if let Some(retries) = healthcheck.retries {
|
||||||
|
arguments.push(format!("--health-retries {}", retries));
|
||||||
|
}
|
||||||
|
if let Some(on_failure) = &healthcheck.on_failure {
|
||||||
|
arguments.push(format!("--health-on-failure {}", on_failure));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
arguments.push(config.service.image.clone());
|
arguments.push(config.service.image.clone());
|
||||||
|
|
||||||
script.push_str(&wrap(&format!("podman run -d {}", arguments.iter()
|
script.push_str(&wrap(&format!("podman run {}", arguments.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, arg)| if i > 0 { format!("\t{}", arg) } else { arg.to_string() })
|
.map(|(i, arg)| if i > 0 { format!("\t{}", arg) } else { arg.to_string() })
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
|
|||||||
@@ -18,16 +18,27 @@ pub struct ServiceConfig {
|
|||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub volumes: Vec<VolumeMapping>,
|
pub volumes: Vec<VolumeMapping>,
|
||||||
|
|
||||||
pub user: Option<String>
|
#[serde(default)]
|
||||||
|
pub mounts: Vec<MountMapping>,
|
||||||
|
|
||||||
|
pub user: Option<String>,
|
||||||
|
|
||||||
|
#[serde(default)]
|
||||||
|
pub capabilities: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct Service {
|
pub struct Service {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
pub hostname: Option<String>,
|
||||||
pub image: String,
|
pub image: String,
|
||||||
pub network: Option<String>,
|
pub network: Option<String>,
|
||||||
|
pub restart: Option<String>,
|
||||||
|
pub detach: Option<bool>,
|
||||||
|
pub healthcheck: Option<HealthCheck>,
|
||||||
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub depend: Vec<String>
|
pub depend: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
@@ -47,4 +58,22 @@ pub struct PortMapping {
|
|||||||
pub struct VolumeMapping {
|
pub struct VolumeMapping {
|
||||||
pub volume: String,
|
pub volume: String,
|
||||||
pub path: String
|
pub path: String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct MountMapping {
|
||||||
|
pub typ: String, // e.g., "bind", "volume"
|
||||||
|
pub source: String,
|
||||||
|
pub target: String,
|
||||||
|
pub read_only: Option<bool>
|
||||||
|
}
|
||||||
|
|
||||||
|
// --health-cmd /healthcheck --health-on-failure=none --health-retries=1
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct HealthCheck {
|
||||||
|
pub cmd: String,
|
||||||
|
pub interval: Option<String>,
|
||||||
|
pub start_period: Option<String>,
|
||||||
|
pub retries: Option<u32>,
|
||||||
|
pub on_failure: Option<String>,
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user