-
Notifications
You must be signed in to change notification settings - Fork 0
/
Notes.txt
144 lines (102 loc) · 5.63 KB
/
Notes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
Where we landed:
1. Build image (e.g. sentry2:envenabled) from Dockerfile with 'docker build -t sentry2:envenabled .'
2. Create container (e.g. sentrycam2) from settings for environment, volumes and devices in YAML with 'docker-compose up'
3. You can repeat 1+2 upon making changes to codebase. Remember to have valid creds entered in YAML.
4. If testing in temporary container, remember to export variables to environment, and command as follows:
docker run --name nonamenow --rm --env USERID=admin --env PASSWD='Shakt!6Sh!va9' --env MQTTIP='192.168.1.219' --env DELTA=60 --privileged=true -v /opt/vc:/opt/vc --env LD_LIBRARY_PATH=/opt/vc/lib --device /dev/vchiq -it sentry2:envenabled
USERID=admin
PASSWD='y0urbe$tgue$$'
MQTTIP=192.168.1.219
DELTA=60
TOPIC=Surveillance/MainDoor
Lessons learned:
1. About making persistent connection with MQTT broker.
2. About making sure camera is not shared between processes.
3. About docker-compose YAML formatting.
Here is the journey.
PART A
[Image: arm32v7/..] -> Dockerfile
-> [Image: sentry] -> docker run
-> [Container: sentry37] -> mod & docker commit
-> [Image: sentryimage] -> docker run with env, vol, dev
-> [Container: sentrycam]
A.1. Make a docker image with dockerfile with base
Image: sentry
Base: arm32v7/python:3.7.10-buster
Manifest: requirements.txt containing numpy, paho-mqtt, picamera, Pillow, matplotlib
Command: docker build -t sentry .
Some components could not be installed via requirements, e.g. matplotlib and the TensorflowLite runtime. Hence 2.
A.2. Install missing components.
- Launch container from image like so: docker run -it --name sentry37 sentry
- Install matplotlib like so: pip install matplotlib==3.0.2
- Install TensorflowLite runtime like so: pip install /path/to/*.whl
Now we have a container with all the ingredients. To verify, launch the Python interpreter and execute import commands.
All except picamera will work. Let's create an intermediate image, sentryimage, to modify further.
A.3. Build new image from container
Image: sentryimage
Container: sentry37 (container) with matplotlib and TensorflowLite runtime installed.
Command: docker commit sentry37 sentryimage
For picamera, some changes in host configuration are required. Let's proceed to make those.
A.4. Make changes to host
- Grant access to users outside the "video" group of which user "pi" is a member
- Create the file: /etc/udev/rules.d/99-camera.rules
- with line: SUBSYSTEM=="vchiq",MODE="0666"
A.5. Create container
Container: sentrycam
Image: sentryimage
Command: docker run -it --name sentrycam --env LD_LIBRARY_PATH=/opt/vc/lib --device /dev/vchiq -v /opt/vc:/opt/vc sentryimage
Compare: docker run --privileged=true -v /opt/vc:/opt/vc --env LD_LIBRARY_PATH=/opt/vc/lib --device /dev/vchiq -it sentryimage
Now, with container running, lauch interactive shell and run the following command to create an environment variable:
echo READTHEDOCS=True >> /etc/environment
Alt.
PART B
[Image: arm32v7/..] -> Dockerfile w dual install
-> [Image: sentry2] -> docker run with env, vol, dev (works!) & mod (experimental config.py)
-> [Container: sentrycam2] -> docker commit
-> [Image: sentry2:configurable] -> docker run with env, vol, dev
-> [Container: ephemeral container]
B.1. Create image from dockerfile.
Adapt as follows:
- Set environment variable in the Dockerfile.
- Install matplotlib by running pip command in Dockerfile instead of including in requirements manifest.
- Install TensorflowLite runtime from pip command with wheel file from copied-over files in app folder.
Call image sentry2. Now docker container from this image will have all pre-reqs for surveillance node satisfied incl. picamera
and TensorflowLite runtime.
B.2. Launch container:
Container: sentrycam2
Image: sentry2
Command: docker run --name sentrycam2 --privileged=true -v /opt/vc:/opt/vc --env LD_LIBRARY_PATH=/opt/vc/lib --device /dev/vchiq -it sentry2
B.3. Make changes
- Create config.py with credentials (uid/pwd) for MQTT connection and other configurable parameters
- Modify main program (sentry_dev.py) to import config and make authenticated requests to MQTT broker with credentials
- Launch dockerized app in interactive shell and test operation.
Pictures should flow to the Node-RED dashboard.
Ultimately, we want a two-step process as follows:
1. Create image using docker-file with app code and all dependencies
2. Create docker containter from image with docker-compose, providing host resources
PART C
[Image: arm32v7/..] -> Dockerfile w dual install
-> [Image: sentry2:envenabled] -> docker run
-> [Container: sentrycam21] -> docker run with env, vol, dev
FINAL CUT:
C.1. Build the image from Dockerfile
- Image: sentry2:envenabled
- Dockerfile (with entrypoint)
- Command: docker build -t sentry2:envenabled .
C.2. Test the app passing env variables, volumes and devices
docker run --name nonamenow --rm --env USERID=admin --env PASSWD='Shakt!6Sh!va9' --env MQTTIP='192.168.1.219' --env DELTA=60 --privileged=true -v /opt/vc:/opt/vc --env LD_LIBRARY_PATH=/opt/vc/lib --device /dev/vchiq -it sentry2:envenabled
C.3. Create the container from image
- Container: sentrycam21
- docker-compose (with env, vol, dev)
- Command: docker-compose up
HOW TO
1. HOW TI create an image from a container? Example:
- Image: sentry:configurable
- Container: sentrycam2
- Command: docker commit sentrycam2 sentry:configurable
The container can be running. The image label has two parts - repository (sentry) and tag (configurable).
You can add images to the same repository with new tags.
2. HOW TO remove a docker image? Example: docker rmi sentry:configurable
3. HOW TO export env variables on Mac temporarily? Example:
- Create: export DELTA=300
- View: echo $DELTA