Create a container to be started later.
(
&self,
name: String,
// Host <-> Container port mappings
ports: Vec<(u32, u32)>,
entrypoint: Vec<String>,
)
| 191 | |
| 192 | /// Create a container to be started later. |
| 193 | pub async fn create( |
| 194 | &self, |
| 195 | name: String, |
| 196 | // Host <-> Container port mappings |
| 197 | ports: Vec<(u32, u32)>, |
| 198 | entrypoint: Vec<String>, |
| 199 | ) -> anyhow::Result<DockerContainer> { |
| 200 | let config = Config { |
| 201 | hostname: Some(name.clone()), |
| 202 | image: Some(self.image.clone()), |
| 203 | user: Some(self.user.to_string()), |
| 204 | entrypoint: Some(entrypoint), |
| 205 | labels: Some(self.labels()), |
| 206 | env: Some(self.env()), |
| 207 | cmd: None, |
| 208 | host_config: Some(HostConfig { |
| 209 | init: Some(true), |
| 210 | binds: Some( |
| 211 | self.volumes |
| 212 | .iter() |
| 213 | .map(|(h, c)| format!("{}:{c}", h.to_string_lossy())) |
| 214 | .collect(), |
| 215 | ), |
| 216 | port_bindings: Some( |
| 217 | ports |
| 218 | .into_iter() |
| 219 | .flat_map(|(h, c)| { |
| 220 | let binding = PortBinding { |
| 221 | host_ip: None, |
| 222 | host_port: Some(h.to_string()), |
| 223 | }; |
| 224 | // Emitting both TCP and UDP, just in case. |
| 225 | vec![ |
| 226 | (format!("{c}/tcp"), Some(vec![binding.clone()])), |
| 227 | (format!("{c}/udp"), Some(vec![binding])), |
| 228 | ] |
| 229 | }) |
| 230 | .collect(), |
| 231 | ), |
| 232 | ..Default::default() |
| 233 | }), |
| 234 | ..Default::default() |
| 235 | }; |
| 236 | |
| 237 | let id = self |
| 238 | .docker |
| 239 | .create_container::<String, _>( |
| 240 | Some(CreateContainerOptions { |
| 241 | name: name.clone(), |
| 242 | ..Default::default() |
| 243 | }), |
| 244 | config, |
| 245 | ) |
| 246 | .await |
| 247 | .context("failed to create container")? |
| 248 | .id; |
| 249 | |
| 250 | eprintln!("RESOURCE: {}", self.name); |
no test coverage detected