Hur delar jag data mellan docker container/tjänster?
På tåg på väg mot Insjön i Dalarna har jag löst ett problem som stört mig rätt länge. Hur gör jag egentligen för att dela data mellan två docker containers/services om jag vill använda docker-compose?
Det här är en fortsättning på projekt som jag har skrivit om här.
Upplägget är att jag har en Docker container som är tänkt att periodiskt hämta in alla föreläsningar från ett flertal institutioner och organisationer. En annan container har jag tänkt ska vara en web-server som listar alla föreläsningar. För att import-containern ska kunna dela informationen med web-containern så har jag för enkelhetens skull enbart valt att använda mig av en csv-fil. (En bättre lösning är antagligen att ha en redig databas, men det får vänta.)
Vad jag inte hade lyckats med innan var hur var hur jag ska kunna få ihop dem båda och dessutom göra det via docker-compose. Anledningen till att jag vill använda just docker-compose är för att jag vill minimera antalet manuella steg när jag startar en ny molntjänst. Det verkar som att en del andra har haft liknande problem och det verkar härröra från att volume-from kommandot har försvunnit när docker-compose gick till version 3.
Lösningen visade sig handla om att använda “Long Syntax” för mappning av volymer och att specifikt använda typen “bind”. Dokumentationen finns under https://docs.docker.com/compose/compose-file/#volumes, och vad jag borde ha läst ordentligt: “The long form syntax allows the configuration of additional fields that can’t be expressed in the short form.”
Den resulterande, fungerande konfigurationen blev därmed:
version: '3.7'
services:
importer:
image: folkbildning.importer:latest
build: ./importer
volumes:
- type: bind
source: /Users/Johannes/PycharmProjects/Folkbildning/db
target: /importer/db/
web:
image: folkbildning.web:latest
build: ./web
ports:
- "5000:5000"
volumes:
- type: bind
source: /Users/Johannes/PycharmProjects/Folkbildning/db
target: /web/db/
Ovanstående fil och resten av projektet finns här: https://github.com/dacre/PopularEducation
En annan notering är dock att en bör sätta rätt behörighet på den fil som delas. Här är länkar till såna frågor
https://github.com/moby/moby/issues/3124
och en fördjupad diskussion av de som utvecklar Docker: https://github.com/moby/moby/issues/30110
och vad som troligen är en bra lösning, även om jag i min lösning inte har valt bästa alternativet: https://dev.to/acro5piano/specifying-user-and-group-in-docker-i2e eller https://medium.com/@nielssj/docker-volumes-and-file-system-permissions-772c1aee23ca.