diff --git a/crates/dev_container/src/devcontainer_json.rs b/crates/dev_container/src/devcontainer_json.rs index f62f7cdde5941733582baa9d3baf761c60a53c81..7326d9bfb1f9acd3145ab5b74b47ca056dbeb1ab 100644 --- a/crates/dev_container/src/devcontainer_json.rs +++ b/crates/dev_container/src/devcontainer_json.rs @@ -222,7 +222,7 @@ pub(crate) struct DevContainer { #[serde(default, deserialize_with = "deserialize_mount_definition")] pub(crate) workspace_mount: Option, pub(crate) workspace_folder: Option, - run_args: Option>, + pub(crate) run_args: Option>, #[serde(default, deserialize_with = "deserialize_string_or_array")] pub(crate) docker_compose_file: Option>, pub(crate) service: Option, diff --git a/crates/dev_container/src/devcontainer_manifest.rs b/crates/dev_container/src/devcontainer_manifest.rs index 0ab80a9d2ad901d8d0eb12bef254c0f49aea0dfa..be3e2f1d5dfc0ef8fca82f4678e9c34b7e6e7d89 100644 --- a/crates/dev_container/src/devcontainer_manifest.rs +++ b/crates/dev_container/src/devcontainer_manifest.rs @@ -1754,11 +1754,36 @@ RUN sed -i -E 's/((^|\s)PATH=)([^\$]*)$/\1\${PATH:-\3}/g' /etc/profile || true command.arg("--privileged"); } + let run_args = match &self.dev_container().run_args { + Some(run_args) => run_args, + None => &Vec::new(), + }; + + for arg in run_args { + command.arg(arg); + } + + let run_if_missing = { + |arg_name: &str, arg: &str, command: &mut Command| { + if !run_args + .iter() + .any(|arg| arg.strip_prefix(arg_name).is_some()) + { + command.arg(arg); + } + } + }; + if &docker_cli == "podman" { - command.args(&["--security-opt", "label=disable", "--userns=keep-id"]); + run_if_missing( + "--security-opt", + "--security-opt=label=disable", + &mut command, + ); + run_if_missing("--userns", "--userns=keep-id", &mut command); } - command.arg("--sig-proxy=false"); + run_if_missing("--sig-proxy", "--sig-proxy=false", &mut command); command.arg("-d"); command.arg("--mount"); command.arg(remote_workspace_mount.to_string()); @@ -2661,8 +2686,14 @@ mod test { serde_json_lenient::Value::String("vsCode".to_string()), ); - let (_, devcontainer_manifest) = - init_default_devcontainer_manifest(cx, "{}").await.unwrap(); + let (_, devcontainer_manifest) = init_default_devcontainer_manifest( + cx, + r#"{ + "name": "TODO" + }"#, + ) + .await + .unwrap(); let build_resources = DockerBuildResources { image: DockerInspect { id: "mcr.microsoft.com/devcontainers/base:ubuntu".to_string(), @@ -3011,6 +3042,11 @@ mod test { "source=dev-containers-cli-bashhistory,target=/home/node/commandhistory", ], + "runArgs": [ + "--cap-add=SYS_PTRACE", + "--sig-proxy=true", + ], + "forwardPorts": [ 8082, 8083, @@ -3303,7 +3339,8 @@ chmod +x ./install.sh vec![ "run".to_string(), "--privileged".to_string(), - "--sig-proxy=false".to_string(), + "--cap-add=SYS_PTRACE".to_string(), + "--sig-proxy=true".to_string(), "-d".to_string(), "--mount".to_string(), "type=bind,source=/path/to/local/project,target=/workspace2,consistency=cached".to_string(),