Search code examples
dockersshraspberry-picontainers

Unable to build docker container: Can't add file <file> to tar: io: read/write on closed pipe


I'm trying to build a container on a raspberry pi from a mac over ssh. I'm setting DOCKER_HOST to ssh://[email protected] (192.168.1.11 is the IP of my raspberry pi).

The docker build command is failing with the following error message:

ERRO[0000] Can't add file /Users/brian/git/github/proj/backend/apps/accounts/managers.py to tar: io: read/write on closed pipe 
ERRO[0000] Can't close tar writer: io: read/write on closed pipe 
error during connect: Post "http://docker/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=localhost%3A5000%2Fbackend%3Ae150d93&target=&ulimits=null&version=1": write |1: broken pipe

The docker version on my mac is:

docker --version
Docker version 20.10.7, build f0df350

The docker version on my raspberry pi is:

docker --version
Docker version 20.10.7, build 20.10.7-0ubuntu1~20.04.1

The container I'm trying to build uses this Dockerfile:

FROM --platform=linux/amd64 python:3.9
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install -r requirements.txt
ADD . /code/
RUN useradd -m app
USER app

I am able to build an image with this Docker file on my mac and also on my raspberry pi.

I have found a few other issues on SO/GitHub that may be related:

Here's some more information from the raspberry pi:

ubuntu@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            3.8G     0  3.8G   0% /dev
tmpfs           782M  2.8M  779M   1% /run
/dev/mmcblk0p2   29G   14G   15G  49% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M  120M  133M  48% /boot/firmware
tmpfs           782M     0  782M   0% /run/user/1000

On the raspberry pi I'm having trouble finding logs from the failed build command. If I restart docker on the raspberry pi:

sudo systemctl restart docker

and then get the logs:

sudo journalctl -fu docker.service

and then run the docker build command again, I don't see any new logs when I run sudo journalctl -fu docker.service again.

Is there another way I can debug the failed docker build command?

Here is docker info from my raspberry pi:

ubuntu@ubuntu:~$ docker info
Client:
 Context:    default
 Debug Mode: false

Server:
 Containers: 21
  Running: 1
  Paused: 0
  Stopped: 20
 Images: 95
 Server Version: 20.10.7
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 
 runc version: 
 init version: 
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 5.4.0-1029-raspi
 Operating System: Ubuntu 20.04.2 LTS
 OSType: linux
 Architecture: aarch64
 CPUs: 4
 Total Memory: 7.628GiB
 Name: ubuntu
 ID: 24DG:6BVV:K3TX:HT64:4U2M:DFHX:2RQA:ENP5:J2WC:V3VS:UKV3:M3TL
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Username: briancaffey
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory TCP limit support
WARNING: No oom kill disable support

Update 8/8/2021: I didn't have certificate-based SSH access setup between my raspberry pi and Mac. Adding -l "debug" to my docker build command this was more clear:

DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):Permission denied, please try again.
 EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
ERRO[0000] Can't add file <file> to tar: io: read/write on closed pipe 
ERRO[0000] Can't close tar writer: io: read/write on closed pipe 
DEBU[0000] FIXME: Got an status-code for which error does not match any expected type!!!: -1  module=api status_code=-1
error during connect: Post "http://docker/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=localhost%3A5000%2Fbackend%3Ae150d93&target=&ulimits=null&version=1": write |1: broken pipe

I have moved past the original issue, but I'm now facing a separate issue that was raised in the comments about platform compatibility. I had to switch from Python 3.9 to Python 3.8 in the base image and also specified --platform="linux/arm64" in the base image:

FROM --platform="linux/arm64" python:3.8

Solution

  • I didn't have certificate-based SSH access setup between my raspberry pi and Mac. Adding -l "debug" to my docker build made this clear:

    DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
    DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
    DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
    DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
    DEBU[0000] commandconn: starting ssh with [-l ubuntu -- 192.168.1.11 docker system dial-stdio] 
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):Permission denied, please try again.
     EBU[0000] commandconn (ssh):[email protected]: Permission denied (publickey,password).
    ERRO[0000] Can't add file <file> to tar: io: read/write on closed pipe 
    ERRO[0000] Can't close tar writer: io: read/write on closed pipe 
    DEBU[0000] FIXME: Got an status-code for which error does not match any expected type!!!: -1  module=api status_code=-1
    error during connect: Post "http://docker/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=localhost%3A5000%2Fbackend%3Ae150d93&target=&ulimits=null&version=1": write |1: broken pipe
    

    To setup passworldless authentication to my raspberry pi, I followed this guide: https://www.raspberrypi.org/documentation/remote-access/ssh/passwordless.md

    Also, in order to build the container on raspberry pi, I needed to use the python:3.8 base image with the platform linux/arm64. Here's the docker build command I used:

    docker \
        -l "debug" \
        build \
        --platform linux/arm64 \
        -t $REGISTRY/backend:$VERSION \
        -f backend/Dockerfile \
        ./backend/