Benoemde volumes worden opgeslagen in de map van docker (/var/lib/docker). Als u een volume in een specifieke hostmap wilt maken, gebruikt u een hostvolume met de volgende syntaxis:
docker run -v /home/ubuntu/data/app-data:/app-data my-image
Of uit je opstelbestand:
version: '2'
services:
mongo:
container_name: "CaseBook-db"
restart: always
image: mongo:3.2.7
ports:
- "27017"
volumes:
- /home/ubuntu/data/db:/data/db
labels:
- "ENVIRONMENT_TYPE=meteor"
app:
container_name: "CaseBook-app"
restart: always
image: "meteor/casebook"
build: .
depends_on:
- mongo
environment:
- MONGO_URL=mongodb://mongo:27017/CaseBook
ports:
- "80:3000"
volumes:
- /home/ubuntu/data/uploads:/Meteor-CaseBook-Container/.uploads
labels:
- "ENVIRONMENT_TYPE=meteor"
Bij hostvolumes wordt de inhoud van het volume in de afbeelding overlappen met de exacte inhoud van de hostmap, inclusief de UID's van de hostmap. Een lege hostmap wordt niet geïnitialiseerd vanuit de afbeelding zoals een leeg benoemd volume is. UID-toewijzingen zijn meestal het moeilijkste onderdeel van het gebruik van een hostvolume.
Bewerken:uit de onderstaande opmerkingen, als je een benoemd volume nodig hebt dat fungeert als een hostvolume, is er een lokale persistente volume-plug-in die wordt vermeld op de plug-inlijst van docker. Na het installeren van de plug-in kunt u volumes maken die verwijzen naar hostmappen, met de functie dat zelfs na het verwijderen van het genoemde volume, de hostdirectory achterblijft. Voorbeeldgebruik van de plug-in omvat:
docker volume create -d local-persist -o mountpoint=/data/images --name=images
docker run -d -v images:/path/to/images/on/one/ one
docker run -d -v images:/path/to/images/on/two/ two
Ze bevatten ook een v2-opstelbestand met het volgende volumevoorbeeld:
volumes:
data:
driver: local-persist
driver_opts:
mountpoint: /data/local-persist/data
Een extra optie waar ik de afgelopen maand van op de hoogte ben gebracht, is om de aankoppelopties van het lokale volumestuurprogramma te gebruiken om handmatig een bind-montage te maken. Dit is vergelijkbaar met een hostvolume in docker met de volgende verschillen:
- Als de directory niet bestaat, zal het proberen om een container te starten met een benoemd volume dat naar een bind-mount verwijst, mislukken. Bij hostvolumes initialiseert docker het naar een lege map die eigendom is van root.
- Als de directory leeg is, zal een benoemd volume de bind-mount initialiseren met de inhoud van de afbeelding op de mount-locatie, inclusief eigendom/machtigingen van bestanden en directory's. Met een hostvolume is er geen initialisatie van de inhoud van de hostdirectory.
Om een benoemd volume te creëren als bind mount, kunt u het van tevoren aanmaken met:
docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
Van een docker run
commando kan dit gedaan worden met --mount
:
docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
Of u kunt in een samengesteld bestand het genoemde volume maken met:
volumes:
data:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
Mijn voorkeur zou zijn om het genoemde volume te gebruiken met het lokale stuurprogramma in plaats van het lokaal blijvende stuurprogramma van derden als u de genoemde volumefuncties nodig hebt.