From a7f94b25b6129a497df3e48220a5b58df7da3dbd Mon Sep 17 00:00:00 2001 From: Tomas Baca Date: Wed, 4 Dec 2024 14:36:50 +0100 Subject: [PATCH] + docker custom configs --- .../30-docker/60-custom-configs.md | 70 +++++++++++++++++- .../30-docker/fig/containers_shared_data.png | Bin 0 -> 34227 bytes 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 docs/10-prerequisities/30-docker/fig/containers_shared_data.png diff --git a/docs/10-prerequisities/30-docker/60-custom-configs.md b/docs/10-prerequisities/30-docker/60-custom-configs.md index 5576e626..e9185c7c 100644 --- a/docs/10-prerequisities/30-docker/60-custom-configs.md +++ b/docs/10-prerequisities/30-docker/60-custom-configs.md @@ -6,4 +6,72 @@ description: Custom configs for containers # Custom configs for containers -TODO +## Problem definition + +A users has a **docker image** from which his software can be started. +The image contains pre-compiled binaries with a **default configuration**. +However, in many cases (robotics applications), the user's software needs to be started with **different configuration** each time. +Configuration can be facilited by several mechanisms: + +* config files, +* ROS launch files, +* shell scripts, +* additional files loaded in runtime. + +These **custom configuration files**, which are handed to the software in runtime, need to be exposed to the **container** runing from the **user's docker image**. + +## Our solution + +We pack the configurations (**shared data**) in a dedicated transport image which is easily delivered to the robot. +Then, **during runtime**, this image spawns a container in which the data is coppied to a **shared docker volume**. +Then, the user's containers are started, all mounting the same **shared docker volume** and accessing the configuration data. + +![](./fig/containers_shared_data.png) + +## Packing shared data to a transport image + +The following minimalistic dockerfile coppies the `shared_data` subfolder in the **transport docker image**: + +```dockerfile +FROM alpine + +COPY shared_data/ /etc/docker/shared_data/ + +CMD ["sh"] +``` + +Build the image using the following command. +Select the appropriate `tag` and `platform`. + +```bash +docker build build . --file Dockerfile --tag --platform=linux/ +``` + +## Unloading the shared data from the transport image + +The following compose session shows the process of unloading the shared data. +The `user_program` can then access the files in the shared docker volume. + +```yaml +volumes: + + shared_data: + +services: + + # will copy session-specific data shared between containers from the shared_data container to a shared volume + copy_shared_data: + image: + volumes: + - shared_data:/tmp/docker/shared_data:consistent + tty: true + command: sh -c "rm -rvf /tmp/docker/shared_data/*; mkdir -pv /tmp/docker/shared_data; cp -rv /etc/docker/shared_data/* /tmp/docker/shared_data/" + + user_program: + image: + depends_on: + - copy_shared_data + volumes: + - shared_data:/etc/docker/shared_data:consistent + command: my_process /etc/docker/shared_data/config_file.txt +``` diff --git a/docs/10-prerequisities/30-docker/fig/containers_shared_data.png b/docs/10-prerequisities/30-docker/fig/containers_shared_data.png new file mode 100644 index 0000000000000000000000000000000000000000..dc65604648c0b847146221cb2ad7cd26812c099e GIT binary patch literal 34227 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 i4-qagfZq9-ZnD; literal 0 HcmV?d00001