Open cboitel opened 1 year ago
Example of stuff to be done in docker-init.sh
:
# original docker socket file (from host)
docker_host_socket_file=/var/run/docker-sock.host
# user container runs as
current_user_name=$(id --user --name)
# grab group id of docker host socket
docker_host_group_id=$(stat -c '%g' ${docker_host_socket_file})
# ensure a group exists with such id
getent group ${docker_host_group_id} || sudo groupadd -g ${docker_host_group_id} docker-host
# ensure user belongs to group and add it if missing
getent group ${docker_host_group_id} | awk -F: '{print $4}' | egrep "(^|,)${current_user_name}(,|$)" ||
sudo usermod --append --groups ${docker_host_group_id} ${current_user_name} \
@alexander-smolyakov Can you help investigate here? thanks!
Even without --interactive
, socat
seems to break simple docker run commands inside the devcontainer. For e.g. this doesn't output anything:
docker run --rm ubuntu /bin/sh -c 'sleep 5; date'
whereas this does:
DOCKER_HOST='unix:///var/run/docker-host.sock' docker run --rm ubuntu /bin/sh -c 'sleep 5; date'
When docker-outside-of-docker feature ends up using
socat
to create a Unix socket ready to use by user in container, you will experience the following inside your terminal:echo "uname; exit 1" | docker run --interactive ubuntu:jammy
will work as expected:Linux
echo "sleep 2; uname; exit 2" | docker run --interactive ubuntu:jammy
won't work as expected:(echo "sleep 2; uname; exit 2"; sleep 3) | docker run --interactive ubuntu:jammy
will work as expectedThis can be reproduced out of devcontainer context by starting
socat
:I had to dig deep but socat manual got the answer:
Without tuning
socat -t xxx
, it will close connection after 0.5s all stdin data has been sent. docker client will then wait for container to get its exit code but will never received the subsequent output. Tuning that timeout can be a nightmare since it has to be more than the longest pause in output data.Best is to get rid of socat and rely on group membership:
I can help if needed.