Hoe voeg ik :cached of :delegated toe aan een docker-compose.yml-volumelijst?

De titel zegt het al. Ik heb een paar volumes ingesteld als alleen-lezen (:ro), maar ik wil :cacheden :delegatedtesten om te helpen met bestand i /o performance, maar kon er niet achter komen hoe dit in te stellen in een opstelbestand.

O, ik heb al getest:

volumes:
- external:internal:cached


Antwoord 1, autoriteit 100%

Uitleg: het doel van het gebruik van volumes-configuratie op docker is om gegevens te delen tussen de host en de docker-container en om gegevensconsistentie tussen beide te waarborgen (wat gebeurt er in A(host/container) wordt weergegeven in B(host/container) en vice versa) . Het gemonteerde volume is “onderdeel” van de container en relevant. Het algemene gebruik is om gedeelde gegevensback-up op te slaan, zowel in de container als op het bestandssysteem in de machine. Als de container wordt verwijderd, bestaat het volume nog steeds en is het onafhankelijk van de containerstatus en wordt het opnieuw gebruikt en geladen vanaf de laatste persistente status.

TLDR:

  • Gebruik cached: wanneer de host wijzigingen uitvoert, bevindt de container zich in de alleen-lezen modus.
  • Gebruik delegated: wanneer docker container wijzigingen uitvoert, is host in read
    enige modus.
  • Gebruik default: wanneer zowel container als host actief zijn en
    continu wijzigingen aan gegevens doorvoeren.
  • Zorg ervoor dat u een bijgewerkte docker-compose- en docker-versie op uw computer gebruikt

Uit documentatie:

Mac gebruikt osxfsom mappen en bestanden die vanuit macOS worden gedeeld naar de Linux-VM te verspreiden. Deze verspreiding maakt deze mappen en bestanden beschikbaar voor Docker-containersdie draaien op Docker Desktop voor Mac.
**Standaard zijn deze shares volledig consistent, wat betekent dat elke keer dat er wordt geschreven op de macOS-host of via een koppeling in een container, de wijzigingen naar de schijf worden gewist, zodat alle deelnemers aan de share een volledig consistent beeld hebben .

Volledige consistentie kan in sommige gevallen ernstige gevolgen hebben voor de prestaties.**
Docker 17.05 en hoger introduceren opties om de consistentie af te stemmen
instelling op een per-mount, per-container basis. De volgende opties zijn:
beschikbaar:

De optie consistency, indien aanwezig, kan een van de opties consistent, delegatedof cachedzijn. Deze instelling is alleen van toepassing op Docker Desktop voor Mac en wordt genegeerd op alle andere platforms.

De Docker-volumevlaggen zijn:

  1. consistentof default: de standaardinstelling met volledige consistentie, zoals hierboven beschreven.
  2. delegated: de weergave van de mount door de containerruntime is gezaghebbend. Er kunnen vertragingen optreden voordat updates die in een container zijn gemaakt, zichtbaar zijn op de host.
    Wanneer gebruik je het? U gebruikt het bijvoorbeeld wanneer de container de gegevens continu verandert en u een back-up van deze gegevens op de host wilt maken, dit is een alleen-lezen bewerking vanuit hostperspectief en daarom zou de juiste keuze worden gedelegeerd.
  3. cached: de weergave van de mount door de macOS-host is gezaghebbend. Er kunnen vertragingen optreden voordat updates op de host zichtbaar zijn in een container. Wanneer u het gebruikt?Bijvoorbeeld wanneer uw host continu gegevens wijzigt die de containerservice leest en gebruikt (zoals configuratie / broncode / weergegeven gegevens van server enz …)

Gebruik:

- <my-first-host-volume>:<first-container-volume-path>:delegated
- <my-second-host-volume>:<second-container-volume-path>:cached

Voorbeeld:

version: '3.4'
services:
  jenkins:
     image: jenkins/jenkins:lts
     environment:
       - JENKINS_HOME=/var/jenkins_home
     container_name: jenkins  
     volumes:
       - '~/jenkins/:/var/jenkins_home:delegated'
       - '~/environment_keys:/var/data:cached'
     ports:
       - 0.0.0.0:8080:8080
     expose:
       - 5000  
     restart: unless-stopped

Antwoord 2, autoriteit 33%

In mijn geval wilde ik een readonly(:ro) volume dat ook :cachedof :delegated. Om dit te doen, gebruik je gewoon deze syntaxis:

volumes:
 - /external/folder:/internal/folder:ro,cached

Antwoord 3, autoriteit 13%

Ik gebruikte geen nieuwe genoeg (edge ​​channel) versie van Docker, dus de commando’s werkten niet. Na het upgraden werkte alles zoals verwacht.


Antwoord 4, autoriteit 8%

Dit antwoord is niet direct gerelateerd aan de vraag, maar heeft hetzelfde doel.

Het docker-sync-project is bedoeld om de problemen van langzame synchronisatie op macOS en Windows op te lossen. Ik heb het ingesteld voor een Ruby on Rails-app en de resultaten waren verbluffend. De resultaten zouden hetzelfde moeten zijn voor andere soorten projecten.

Hier is mijn sjabloon dockerfile-compose

version: '3.4'
volumes:
  app-code:
    external: true
services:
  backend:
    volumes:
      - app-code/:/app:rw

En het docker-sync-bestand

version: 2
syncs:
  app-code:
    src: './'
    sync_strategy: 'native_osx'
    sync_excludes:
      - '.git'
      - 'coverage'
      - .gitignore'
    watch_excludes:
      - '.*/.git'
      - '.gitignore'
      - 'log'
      - 'docker-*.yml'

Vervolgens kunt u docker-sync startvolgen of de documentatie volgen om docker-sync te gebruiken in plaats van docker-composeom de synchronisatie automatisch te starten/stoppen wanneer dat nodig is.

p>

Een van de belangrijkste nadelen is de afhankelijkheid van het docker-sync-juweel dat u op uw besturingssysteem moet installeren, maar als het eenmaal is ingesteld, werkt het fantastisch.


Antwoord 5

Ik vond dat deze thread moest worden bijgewerkt om de huidige situatie beter weer te geven.

Sinds Docker voor Mac gRPC-FUSE omvatte, zijn deze vlaggen verwijderd uit de Docker-documentatie omdat ze niet langer nodig zijn. Het is veilig om ze uit uw docker-compose.yml-bestanden te verwijderen.

https://github.com/docker/for-mac/issues/5402

Je kunt zien dat gRPC-FUSE standaard is geselecteerd in Docker Desktop. Ga naar Instellingen > Tabblad Algemeen.

Other episodes