wslcontainers
Ask AI wslc 2.9.4.0

docker run on wslc

Updated 2026-07-27 · 3 min read · wslc public preview

docker run is partial on wslc 2.9.4.0. The command exists as wslc run, but its flags, defaults or output format do not match Docker byte-for-byte, so the shape of your invocation decides whether it needs an edit.

Docker commanddocker run
Status on wslc 2.9.4.0Partial
wslc commandwslc run
Verified againstwslc 2.9.4.0, windows-2025 runner

Measured detail. -d, -p, -v, -e, --name, --rm, -it, -m all exist. No --device, --platform or --restart. Memory units must be uppercase: 512M works, 512m is rejected.

The wslc equivalent

# Docker
docker run

# wslc
wslc run

wslc run [<options>] <image> [<command>] [<arguments>...]

Straight from wslc run --help on wslc 2.9.4.0 .

ArgumentMeaning
imageImage name
commandThe command to run
argumentsArguments to pass to container's init process
FlagMeaning
--cidfileWrite the container ID to the provided path
--cpusNumber of CPUs (e.g. 0.5, 1, 2.5)
-d,--detachRun container in detached mode
--dnsIP address of the DNS nameserver in resolv.conf
--dns-optionSet DNS options
--dns-searchSet DNS search domains
--domainnameContainer domain name
--entrypointSpecifies the container init process executable
-e,--envKey=Value pairs for environment variables
--env-fileFile containing key=value pairs of env variables
--gpusAdd GPU devices to the container ('all' to pass all GPUs)
--health-cmdCommand to run to check container health
--health-intervalTime between running the health check (e.g. 30s, 1m30s)
--health-retriesConsecutive failures needed to report the container as unhealthy
--health-start-periodStart period for the container to initialize before health-check countdown (e.g. 30s, 1m30s)
--health-timeoutMaximum time to allow one health check to run (e.g. 30s, 1m30s)
-h,--hostnameContainer host name
-i,--interactiveAttach to stdin and keep it open
-l,--labelSet metadata on an object
-m,--memoryMemory limit (e.g. 512M, 1G)
--nameName of the container
--networkConnect a container to a network
--network-aliasAdd a network-scoped alias for the container
--no-healthcheckDisable any container-specified health check
-p,--publishPublish a port from a container to host
-P,--publish-allPublish all exposed ports to random host ports
--rmRemove the container after it stops
--shm-sizeSize of /dev/shm (e.g. 64M, 1G)
--stop-signalSignal to stop the container
--stop-timeoutTimeout (in seconds) to stop the container before killing it (-1 for no timeout)
--tmpfsMount tmpfs to the container at the given path
-t,--ttyOpen a TTY with the container process.
--ulimitUlimit options (format: <name>=<soft>[:<hard>], use -1 for unlimited)
-u,--userUser ID for the process (name|uid|uid:gid)
-v,--volumeBind mount a volume to the container
-w,--workdirWorking directory inside the container

How we know

Confirmed by reading wslc --help output and, where the behaviour depends on execution rather than argument parsing, by running the command against wslc 2.9.4.0 on a Windows Server 2025 GitHub Actions runner. Unrecognized flags and subcommands fail loudly on wslc -- the parser answers Argument name was not recognized for the current command and exits non-zero -- so a typo is unlikely to be misread as support. The risk runs the other way: a Docker habit that happens to parse (like wslc ps still working) can mask a difference in what the flags underneath it do.

Claims on this site are re-checked by a scheduled workflow that runs the commands again on a fresh Windows Server 2025 runner and fails when a documented behaviour stops matching reality. wslc ships roughly every two weeks during the preview, so treat any page that disagrees with your own machine as the page being stale, and check the version you are on with wslc version.

Where this fits

This is one row of the full Docker to wslc cheat sheet, which covers every command and every flag on a single page. If the workload you are porting uses Docker Compose rather than bare docker invocations, start from Compose key support instead -- docker run rarely appears verbatim in a compose.yaml, and the key-level page maps YAML fields directly to the flags shown above. For a whole script at once, paste it into the command converter and get every line classified in the same pass.

Related guides