s6 overlay, docker exec, and PATH - blitterated/docker-dev-env-s6 GitHub Wiki

Does s6-overlay version 3 break docker exec? Is this intentional? Or is this just Operator Error on my part?

s6-overlay version 3

Here's a basic Ubuntu with s6-overlay version 3.

cat <<"EOF" > Dockerfile
FROM ubuntu

RUN apt update && apt --yes upgrade && \
    apt install --yes tar xz-utils

ARG S6_OVERLAY_VERSION=3.0.0.2

ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch-${S6_OVERLAY_VERSION}.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch-${S6_OVERLAY_VERSION}.tar.xz
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-x86_64-${S6_OVERLAY_VERSION}.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-x86_64-${S6_OVERLAY_VERSION}.tar.xz

ENTRYPOINT ["/init"]
EOF

Build an image.

docker build -t s6o_v3 .

Experiment #3.1

Run a container and check env

docker run --rm s6o_v3 env

Here we can see that /command is in PATH.

...
PATH=/command:/usr/bin:/bin
PWD=/
...

Experiment #3.2

Run a container, but this time use with-contenv env.

docker run --rm s6o_v3 with-contenv env

The results are essentially the same as experiment #3.1.

...
PATH=/command:/usr/bin:/bin
PWD=/
HOME=/root
HOSTNAME=f65fd42dd081
...

Start a container in daemon mode

CID=$(docker run -d s6o_v3)

Experiment #3.3

Run env in the daemon container via docker exec.

docker exec $CID env

What happend to having /command in PATH?

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=8d99e9086565
HOME=/root

Experiment #3.4

Similar to Experiment #3.2, run env via with-contenv in the daemon container.

docker exec $CID with-contenv env

This fails because /command is not in PATH.

OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "with-contenv": executable file not found in $PATH: unknown

Experiment #3.5

Use fully qualified path to with-contenv.

docker exec $CID /command/with-contenv env

It still fails. Looks like with-contenv needs /command in PATH.

execlineb: fatal: unable to exec ifelse: No such file or directory

Experiment #3.6

Force a path like the one in Experiment #3.2.

docker exec -e 'PATH=/command:/usr/bin:/bin'  $CID with-contenv env

We get the same basic result as Experiment #3.2.

PATH=/command:/usr/bin:/bin
PWD=/
HOME=/root
HOSTNAME=8d99e9086565

Shut down the daemon container

docker stop $CID

s6-overlay version 2

Here's a basic Ubuntu with s6-overlay version 3.

cat <<"EOF" > Dockerfile
FROM ubuntu

ADD https://github.com/just-containers/s6-overlay/releases/download/v2.2.0.3/s6-overlay-amd64-installer /tmp/

RUN chmod +x /tmp/s6-overlay-amd64-installer && \
    /tmp/s6-overlay-amd64-installer /

ENTRYPOINT ["/init"]
EOF

Build an image.

docker build -t s6o_v2 .

Experiment #2.1

Run a container and check env

docker run --rm s6o_v2 env

Here we can see that /command is in PATH.

...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/root
CWD=/
HOSTNAME=ea42a20e7f76
S6_LOGGING=0
...

Experiment #2.2

Run a container, but this time use with-contenv env.

docker run --rm s6o_v2 with-contenv env

The results are essentially the same as experiment #2.1.

...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/root
CWD=/
HOSTNAME=520c0b8d90f8
...

Start a container in daemon mode

CID=$(docker run -d s6o_v2)

Experiment #2.3

Run env in the daemon container via docker exec.

docker exec $CID env

Looks OK, we still have /usr/bin.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=bd27f17eb25a
HOME=/root

Experiment #2.4

Similar to Experiment #2.2, run env via with-contenv in the daemon container.

docker exec $CID with-contenv env

Still getting a successful result.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/root
CWD=/
HOSTNAME=bd27f17eb25a

Shut down the daemon container

docker stop $CID
⚠️ **GitHub.com Fallback** ⚠️