8

I am trying to use the i2c pins on a raspberry pi inside a docker container. I install all my modules using RUN but when I use the CMD to run my python program i get an error that says

Trackback (most recent call last):
file "test.py", line 124, in <module>
bus = smbus.SMBus(1)
IOError: [Errno 2] No such file or directory

If I run this on my raspberry pi and not in my container it works fine. But when I turn off my i2c pins on my raspberry pi it gives me the same error when running it. So I know it has to do with my i2c pins being activated. Does anyone know how to resolve this problem?

Duncan C. Henke
  • 145
  • 1
  • 11

2 Answers2

14

As a security precaution, system devices are not exposed by default inside Docker containers. You can expose specific devices to your container using the --device option to docker run, as in:

docker run --device /dev/i2c-0 --device /dev/i2c-1 myimage

You can remove all restrictions with the --privileged flag:

docker run --privileged myimage

This will expose all of /dev to your container, and remove other restrictions as well (e.g., you will be able to change the network configuration in the container and mount new filesystems).

larsks
  • 277,717
  • 41
  • 399
  • 399
  • Any ideas about docker-compose? – dmigo Feb 24 '18 at 22:45
  • Docker compose offers support for pretty much all of the `docker run` option. See [the docs](https://docs.docker.com/compose/compose-file/) for the equivalent of `--device`. – larsks Feb 24 '18 at 22:57
3

You should use the following in docker-compose (tested with v3 of docker-compose spec):

devices:  
  - "/dev/i2c-1:/dev/i2c-1"  
Sergey V.
  • 840
  • 8
  • 15