Skip to content

Commit

Permalink
fix multiple networks
Browse files Browse the repository at this point in the history
  • Loading branch information
cars10 committed Feb 11, 2024
1 parent f7db5a9 commit fb0c92b
Showing 1 changed file with 22 additions and 3 deletions.
25 changes: 22 additions & 3 deletions src/docker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ use bollard::{
container::{Config, CreateContainerOptions, NetworkingConfig, StartContainerOptions},
image::CreateImageOptions,
models::ContainerConfig,
network::ConnectNetworkOptions,
service::CreateImageInfo,
Docker,
};
use futures_util::stream::StreamExt;
use log::debug;
use std::collections::HashMap;

pub async fn pull_image(docker: &Docker, image: String) -> Result<(), AutodokError> {
let options = Some(CreateImageOptions {
Expand All @@ -30,9 +32,11 @@ pub async fn stop_start_container(
) -> Result<(), crate::AutodokError> {
let info = docker.inspect_container(&container, None).await?;

// stop and remove old container
docker.stop_container(&container, None).await?;
docker.remove_container(&container, None).await?;

// build general options for new container
let create_options = Some(CreateContainerOptions {
name: container.clone(),
platform: info.platform,
Expand All @@ -42,16 +46,31 @@ pub async fn stop_start_container(
image: Some(image),
..info.config.unwrap()
};
let network_config = NetworkingConfig {
endpoints_config: info.network_settings.unwrap().networks.unwrap(),
};

// build network options - we can only create with a single network, the rest needs to be connected later
let mut previous_networks = info.network_settings.unwrap().networks.unwrap();
let default_network_name = previous_networks.keys().next().unwrap().to_string();
let default_network = previous_networks.remove(&default_network_name).unwrap();

let mut endpoints_config = HashMap::new();
endpoints_config.insert(default_network_name, default_network);

let network_config = NetworkingConfig { endpoints_config };

let mut config = Config::from(container_config);
config.host_config = info.host_config;
config.networking_config = Some(network_config);

docker.create_container(create_options, config).await?;

for (network_name, endpoint_config) in previous_networks {
let config = ConnectNetworkOptions {
container: &container,
endpoint_config,
};
docker.connect_network(&network_name, config).await.unwrap();
}

docker
.start_container(&container, None::<StartContainerOptions<String>>)
.await?;
Expand Down

0 comments on commit fb0c92b

Please sign in to comment.