public async Task <int> DockerRun(IExecutionContext context, ContainerInfo container, EventHandler <ProcessDataReceivedEventArgs> stdoutDataReceived, EventHandler <ProcessDataReceivedEventArgs> stderrDataReceived) { IList <string> dockerOptions = new List <string>(); // OPTIONS dockerOptions.Add($"--name {container.ContainerDisplayName}"); dockerOptions.Add($"--label {DockerInstanceLabel}"); dockerOptions.Add($"--workdir {container.ContainerWorkDirectory}"); dockerOptions.Add($"--rm"); foreach (var env in container.ContainerEnvironmentVariables) { // e.g. -e MY_SECRET maps the value into the exec'ed process without exposing // the value directly in the command dockerOptions.Add($"-e {env.Key}"); } // Watermark for GitHub Action environment dockerOptions.Add("-e GITHUB_ACTIONS=true"); // Set CI=true when no one else already set it. // CI=true is common set in most CI provider in GitHub if (!container.ContainerEnvironmentVariables.ContainsKey("CI")) { dockerOptions.Add("-e CI=true"); } if (!string.IsNullOrEmpty(container.ContainerEntryPoint)) { dockerOptions.Add($"--entrypoint \"{container.ContainerEntryPoint}\""); } if (!string.IsNullOrEmpty(container.ContainerNetwork)) { dockerOptions.Add($"--network {container.ContainerNetwork}"); } foreach (var volume in container.MountVolumes) { // replace `"` with `\"` and add `"{0}"` to all path. String volumeArg; if (String.IsNullOrEmpty(volume.SourceVolumePath)) { // Anonymous docker volume volumeArg = $"-v \"{volume.TargetVolumePath.Replace("\"", "\\\"")}\""; } else { // Named Docker volume / host bind mount volumeArg = $"-v \"{volume.SourceVolumePath.Replace("\"", "\\\"")}\":\"{volume.TargetVolumePath.Replace("\"", "\\\"")}\""; } if (volume.ReadOnly) { volumeArg += ":ro"; } dockerOptions.Add(volumeArg); } // IMAGE dockerOptions.Add($"{container.ContainerImage}"); // COMMAND // Intentionally blank. Always overwrite ENTRYPOINT and/or send ARGs // [ARG...] dockerOptions.Add($"{container.ContainerEntryPointArgs}"); var optionsString = string.Join(" ", dockerOptions); return(await ExecuteDockerCommandAsync(context, "run", optionsString, container.ContainerEnvironmentVariables, stdoutDataReceived, stderrDataReceived, context.CancellationToken)); }
public async Task <string> DockerCreate(IExecutionContext context, ContainerInfo container) { IList <string> dockerOptions = new List <string>(); // OPTIONS dockerOptions.Add($"--name {container.ContainerDisplayName}"); dockerOptions.Add($"--label {DockerInstanceLabel}"); if (!string.IsNullOrEmpty(container.ContainerWorkDirectory)) { dockerOptions.Add($"--workdir {container.ContainerWorkDirectory}"); } if (!string.IsNullOrEmpty(container.ContainerNetwork)) { dockerOptions.Add($"--network {container.ContainerNetwork}"); } if (!string.IsNullOrEmpty(container.ContainerNetworkAlias)) { dockerOptions.Add($"--network-alias {container.ContainerNetworkAlias}"); } foreach (var port in container.UserPortMappings) { dockerOptions.Add($"-p {port.Value}"); } dockerOptions.Add($"{container.ContainerCreateOptions}"); foreach (var env in container.ContainerEnvironmentVariables) { if (String.IsNullOrEmpty(env.Value)) { dockerOptions.Add($"-e \"{env.Key}\""); } else { dockerOptions.Add($"-e \"{env.Key}={env.Value.Replace("\"", "\\\"")}\""); } } // Watermark for GitHub Action environment dockerOptions.Add("-e GITHUB_ACTIONS=true"); // Set CI=true when no one else already set it. // CI=true is common set in most CI provider in GitHub if (!container.ContainerEnvironmentVariables.ContainsKey("CI")) { dockerOptions.Add("-e CI=true"); } foreach (var volume in container.MountVolumes) { // replace `"` with `\"` and add `"{0}"` to all path. String volumeArg; if (String.IsNullOrEmpty(volume.SourceVolumePath)) { // Anonymous docker volume volumeArg = $"-v \"{volume.TargetVolumePath.Replace("\"", "\\\"")}\""; } else { // Named Docker volume / host bind mount volumeArg = $"-v \"{volume.SourceVolumePath.Replace("\"", "\\\"")}\":\"{volume.TargetVolumePath.Replace("\"", "\\\"")}\""; } if (volume.ReadOnly) { volumeArg += ":ro"; } dockerOptions.Add(volumeArg); } if (!string.IsNullOrEmpty(container.ContainerEntryPoint)) { dockerOptions.Add($"--entrypoint \"{container.ContainerEntryPoint}\""); } // IMAGE dockerOptions.Add($"{container.ContainerImage}"); // COMMAND // Intentionally blank. Always overwrite ENTRYPOINT and/or send ARGs // [ARG...] dockerOptions.Add($"{container.ContainerEntryPointArgs}"); var optionsString = string.Join(" ", dockerOptions); List <string> outputStrings = await ExecuteDockerCommandAsync(context, "create", optionsString); return(outputStrings.FirstOrDefault()); }