Improve this doc

Interact with hardware

For many projects, you may need to control or have access to some external hardware via interfaces like GPIO, I2C or SPI. For single-container applications, you will automatically have access to /dev and these interfaces as the container is run in privileged mode. This means you should be able to use any hardware modules like you would in a vanilla Linux environment.

Multicontainer applications do not run containers in privileged mode by default. If you want to make use of hardware, you will have to appropriately configure your docker-compose.yml file to either set some services to privileged, using privileged: true, or use the cap_add and devices settings to map in the correct hardware access to the container.

As an example, here the gpio service is set up to use i2c sensors:

gpio:
    build: ./gpio
    devices:
      - "/dev/i2c-1:/dev/i2c-1"
      - "/dev/mem:/dev/mem"
    cap_add: 
      - SYS_RAWIO

Note: If you are not using one of the Docker base images recommended in our base images wiki, then it's most likely you will need to handle the updating of /dev via udev yourself. You can see an example of how our base images handle this here.

For more details on interacting with external hardware, check out these guides: