Build My Own Raspbian Docker Image
It’s great to have Docker on Raspberry Pi, and there’s a blog about it.
Update 2021
After so many years, the ecosystem has evolved a lot. Docker supports multi-CPU architecture so does many images, e.g. alpine. It’s no longer needed to do those complex steps by yourself.
Previous Blog
But one thing I found is that Raspberry Pi is based on ARM CPU, thus do not support x86/x64 instructions. Any Docker image build for x86/x64 won’t work. And, I didn’t find any official Docker image built for Raspberry Pi. resin/rpi-raspbian is widely used and also used by Docker project is a good candidate and is lightweitht, but I still want to use an official one. So, I decided to build one myself.
Download Raspbian
I have done this already, download and unzip the image. Now I got 2016-09-23-raspbian-jessie-lite.img
.
Create a tarball archive containing files from official Raspbian
2016-09-23-raspbian-jessie-lite.img
is an IMG file which contains raw dump of disk, and I can mount it under Linux.
List the partitions of the img
1
2
3
4
5
6
7
8
9
10
11
12
[blah@localhost ~]$ fdisk -l ./2016-09-23-raspbian-jessie-lite.img
Disk ./2016-09-23-raspbian-jessie-lite.img: 1389 MB, 1389363200 bytes, 2713600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5a7089a1
Device Boot Start End Blocks Id System
./2016-09-23-raspbian-jessie-lite.img1 8192 137215 64512 c W95 FAT32 (LBA)
./2016-09-23-raspbian-jessie-lite.img2 137216 2713599 1288192 83 Linux
Two partitions are listed here, and the second one is the root fs of Raspbian.
Mount the img using loop device
1
2
3
4
5
[blah@localhost ~]$ sudo losetup -Pr /dev/loop0 2016-09-23-raspbian-jessie-lite.img
[blah@localhost ~]$ ls /dev/loop0*
/dev/loop0 /dev/loop0p1 /dev/loop0p2
[blah@localhost ~]$ mkdir rpi
[blah@localhost ~]$ sudo mount -o ro /dev/loop0p2 ./rpi
When I list file under rpi directory, I should see all files to root of Raspbian.
Archive the filesystem to tarball
Next, I will archive the whole Raspbian file system to a tarball archive to import into Docker image.
1
sudo tar -C ./rpi -czpf 2016-09-23-raspbian-jessie-lite.tar.gz --numeric-owner .
This will generate 2016-09-23-raspbian-jessie-lite.tar.gz
under current folder, and preserving all permissions with numeric owner id. I can view the files inside tarball using:
1
tar --numeric-owner -tvzf 2016-09-23-raspbian-jessie-lite.tar.gz
And, unmount the devices.
1
2
sudo umount ./rpi
sudo losetup -d /dev/loop0
Create Dockerfile
Now, I can upload the tarball file into Raspberry Pi and create my Docker image. Below is my Dockerfile, and I put 2016-09-23-raspbian-jessie-lite.tar.gz
in the same directory besides Dockerfile.
1
2
3
FROM scratch
ADD ./2016-09-23-raspbian-jessie-lite.tar.gz /
CMD ["/bin/bash"]
Then, I’m just one step away from finish.
1
2
3
4
5
6
7
8
9
10
11
➜ blah@raspberrypi:raspbian git:(master)✗ $ docker build -t blah .
Sending build context to Docker daemon 290.8 MB
Step 1 : FROM scratch
--->
Step 2 : ADD ./2016-09-23-raspbian-jessie-lite.tar.gz /
---> Using cache
---> f22314f2ba29
Step 3 : CMD /bin/bash
---> Using cache
---> 86f8965d6316
Successfully built 86f8965d6316
Voilà, it’s done! The only drawback is size of image. Seems Raspbian shipped with lots of extra packages, the image I created is 694.4 MB.
1
2
3
4
➜ blah@raspberrypi:raspbian git:(master)✗ $ docker run -it blah
root@a6318807be9d:/# echo "hello-world"
hello-world
root@a6318807be9d:/#
Docker Hub
I have pushed it to Docker Hub, if you want to use mine, you can use guoyiang/raspbian . But I guess you would prefer build your own :)
I also found an interesting Docker repository which has some armhf images to use: armhf. Well, Docker/Raspberry Pi Foundation, please provide us some official images.