Available on Raspberry Pi 2B v1.2, 3A+, 3B, 3B+, 4B, 400, Compute Module 3, Compute Module 3+ and Compute Module 4 only.
This page explains how to boot your Raspberry Pi from a USB mass storage device such as a flash drive or a USB hard disk. When attaching USB devices, particularly hard disks and SSDs, be mindful of their power requirements. If you wish to attach more than one SSD or hard disk to the Pi, this normally requires external power - either a powered hard disk enclosure, or a powered USB hub. Note that models prior to the Pi 4B have known issues which prevent booting with some USB devices.
Learn how to install Portainer to your Raspberry Pi. Portainer is a Docker management tool that makes managing your containers a breeze. Creating and maintaining your Docker containers becomes a simple task when using this web interface.
The database that is being used in the docker-compose file on the site isn’t compatible with ARM processors, so we’ll need to change that in a bit. But first, we need to get logged in to our Raspberry Pi’s Portainer. This tutorial assumes that you already have Docker and Portainer installed, most likely via OpenMediaVault. Earlier this week I set up.NET Core and Docker on a Raspberry Pi and found that I could run my podcast website quite easily on a Pi. Check that post out as there's a lot going on. I can test within a Linux Container and output the test results to the host and then open them in VS. The Raspberry Pi is a popular single-board computer designed to promote the teaching of computer science in schools. The use of the Raspberry Pi computer ranges from robotics to home automation. Many variations of the Raspberry Pi exist, such as the Raspberry Pi Zero, which is smaller than the more powerful Raspberry Pi 4.
Raspberry Pi 4B and Raspberry Pi 400
The Raspberry Pi Pi 400 and newer Raspberry Pi 4B boards support USB boot by default. On earlier Raspberry Pi 4B boards, or to select alternate boot modes, the bootloader must be updated.
Using Raspberry Pi Imager to update the bootloader (recommended)
Raspberry Pi Imager provides a GUI for updating the bootloader
- Download Raspberry Pi Imager
- Select a spare SD card. The contents will get overwritten!
- Launch
Raspberry Pi Imager
- Select
Misc utility images
underOperating System
- Select
Bootloader
- Select
USB
- Select Storage and then Write
Using raspi-config to update the bootloader from within Raspberry Pi OS
To change the boot-mode from within Raspberry Pi OS run raspi-config
- Run
sudo raspi-config
- Select
Advanced Options
- Select
Boot Order
- Select
USB
- Reboot
See also:-
- The bootloader configuration page for other boot configuration options
- The bootloader EEPROM page for more information
Compute Module 4
Please see the Flashing the Compute Module eMMC for bootloader update instructions.
Raspberry Pi 3B+
The Raspberry Pi 3B+ supports USB mass storage boot out of the box.
Raspberry Pi 2B v1.2, 3A+, 3B, Compute Module 3, 3+
Docker In Raspberry Pi Raspberry Pi
On the Raspberry Pi 2B v1.2, 3A+, 3B, and Compute Module 3, 3+ you must first enable USB host boot mode. This is to allow USB mass storage boot, and network boot. Note that network boot is not supported on the Raspberry Pi 3A+.
To enable USB host boot mode, the Raspberry Pi needs to be booted from an SD card with a special option to set the USB host boot mode bit in the one-time programmable (OTP) memory. Once this bit has been set, the SD card is no longer required. Note that any change you make to the OTP is permanent and cannot be undone.
On the Raspberry Pi 3A+, setting the OTP bit to enable USB host boot mode will permanently prevent that Pi from booting in USB device mode.
You can use any SD card running Raspberry Pi OS to program the OTP bit.
Enable USB host boot mode with this code:
This adds program_usb_boot_mode=1
to the end of /boot/config.txt
.
Note that although the option is named program_usb_boot_mode
, it only enables USB host boot mode. USB device boot mode is only available on certain models of Raspberry Pi - see USB device boot mode.
The next step is to reboot the Raspberry Pi with sudo reboot
and check that the OTP has been programmed with:
Check that the output 0x3020000a
is shown. If it is not, then the OTP bit has not been successfully programmed. In this case, go through the programming procedure again. If the bit is still not set, this may indicate a fault in the Pi hardware itself.
If you wish, you can remove the program_usb_boot_mode
line from config.txt
, so that if you put the SD card into another Raspberry Pi, it won't program USB host boot mode. Make sure there is no blank line at the end of config.txt
.
You can now boot from a USB mass storage device in the same way as booting from an SD card - see the following section for further information.
Booting from the USB mass storage device
The procedure is the same as for SD cards - simply image the USB storage device with the operating system image.
After preparing the storage device, connect the drive to the Raspberry Pi and power up the Pi, being aware of the extra USB power requirements of the external drive.After five to ten seconds, the Raspberry Pi should begin booting and show the rainbow splash screen on an attached display. Make sure that you do not have an SD card inserted in the Pi, since if you do, it will boot from that first.
See the bootmodes documentation for the boot sequence and alternative boot modes (network, USB device, GPIO or SD boot).
Known issues (not Pi 4B, CM4 and Pi 400)
Docker Raspberry Pi Os
- The default timeout for checking bootable USB devices is 2 seconds. Some flash drives and hard disks power up too slowly. It is possible to extend this timeout to five seconds (add a new file
timeout
to the SD card), but note that some devices take even longer to respond. - Some flash drives have a very specific protocol requirement that is not handled by the bootcode and may thus be incompatible.
Special bootcode.bin-only boot mode (not Pi 4B, CM4 and Pi 400)
If you are unable to use a particular USB device to boot your Raspberry Pi, an alternative for the Pi 2B v1.2, 3A+, 3B and 3B+ is to use the special bootcode.bin-only boot mode as described here. The Pi will still boot from the SD card, but bootcode.bin
is the only file read from it.
Estimated reading time: 5 minutes
Docker images can support multiple architectures, which means that a singleimage may contain variants for different architectures, and sometimes for differentoperating systems, such as Windows.
When running an image with multi-architecture support, docker
willautomatically select an image variant which matches your OS and architecture.
Most of the official images on Docker Hub provide a variety of architectures.For example, the busybox
image supports amd64
, arm32v5
, arm32v6
,arm32v7
, arm64v8
, i386
, ppc64le
, and s390x
. When running this imageon an x86_64
/ amd64
machine, the x86_64
variant will be pulled and run.
Docker Desktop provides binfmt_misc
multi-architecture support,which means you can run containers for different Linux architecturessuch as arm
, mips
, ppc64le
, and even s390x
.
This does not require any special configuration in the container itself as it usesqemu-static from the Docker forMac VM. Because of this, you can run an ARM container, like the arm32v7
or ppc64le
variants of the busybox image.
Buildx (Experimental)
Docker is now making it easier than ever to develop containers on, and for Arm servers and devices. Using the standard Docker tooling and processes, you can start to build, push, pull, and run images seamlessly on different compute architectures. Note that you don’t have to make any changes to Dockerfiles or source code to start building for Arm.
Docker In Raspberry Pi
Docker introduces a new CLI command called buildx
. You can use the buildx
command on Docker Desktop for Mac and Windows to build multi-arch images, link them together with a manifest file, and push them all to a registry using a single command. With the included emulation, you can transparently build more than just native images. Buildx accomplishes this by adding new builder instances based on BuildKit, and leveraging Docker Desktop’s technology stack to run non-native binaries.
For more information about the Buildx CLI command, see Buildx.
Install
Docker Raspberry Pi Gpio
Download the latest version of Docker Desktop.
Follow the on-screen instructions to complete the installation process. After you have successfully installed Docker Desktop, you will see the Docker icon in your task tray.
Click About Docker Desktop from the Docker menu and ensure you have installed Docker Desktop version 2.0.4.0 (33772) or higher.
Build and run multi-architecture images
Run the command docker buildx ls
to list the existing builders. This displays the default builder, which is our old builder.
Create a new builder which gives access to the new multi-architecture features.
Alternatively, run docker buildx create --name mybuilder --use
to create a new builder and switch to it using a single command.
Switch to the new builder and inspect it.
Test the workflow to ensure you can build, push, and run multi-architecture images. Create a simple example Dockerfile, build a couple of image variants, and push them to Docker Hub.
Docker In Raspberry Pi 4
Where, username
is a valid Docker username.
Notes:
- The
--platform
flag informs buildx to generate Linux images for AMD 64-bit, Arm 64-bit, and Armv7 architectures. - The
--push
flag generates a multi-arch manifest and pushes all the images to Docker Hub.
Inspect the image using imagetools
.
The image is now available on Docker Hub with the tag username/demo:latest
. You can use this image to run a container on Intel laptops, Amazon EC2 A1 instances, Raspberry Pis, and on other architectures. Docker pulls the correct image for the current architecture, so Raspberry Pis run the 32-bit Arm version and EC2 A1 instances run 64-bit Arm. The SHA tags identify a fully qualified image variant. You can also run images targeted for a different architecture on Docker Desktop.
You can run the images using the SHA tag, and verify the architecture. For example, when you run the following on a macOS:
In the above example, uname -m
returns aarch64
and armv7l
as expected, even when running the commands on a native macOS developer machine.