web-dev-qa-db-de.com

Wie kann ich ein Host-Verzeichnis als Volume in Docker Compose bereitstellen?

Ich habe eine Entwicklungsumgebung, die ich dockerisiere, und ich möchte die Möglichkeit, meine Änderungen ohne Neuerstellung von Docker-Images neu zu laden. Ich verwende Docker Compose, weil Redis eine der Abhängigkeiten meiner App ist und ich es mag, einen Redis-Container verknüpfen zu können

Ich habe zwei Container in meinem docker-compose.yml:

node:
    build: ./node
    links:
        - redis
    ports:
        - "8080"
    env_file:
        - node-app.env

redis:
    image: redis
    ports:
        - "6379"

Ich habe den Punkt in der Docking-Datei meiner node -Anwendung erreicht, an dem ich ein Volume hinzufüge. Wie kann ich das Host-Verzeichnis in das Volume einbinden, sodass alle meine Live-Änderungen am Code im Container wiedergegeben werden?

Hier ist mein aktuelles Dockerfile:

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <[email protected]i.me>

# Install nodemon
RUN npm install -g nodemon

# Add a /app volume
VOLUME ["/app"]

# TODO: link the current . to /app

# Define working directory
WORKDIR /app

# Run npm install
RUN npm install

# Expose port
EXPOSE  8080

# Run app using nodemon
CMD ["nodemon", "/app/app.js"]

Mein Projekt sieht so aus:

/
- docker-compose.yml
- node-app.env
- node/
  - app.js
  - Dockerfile.js
76
Upvote Me

Kasse ihre Dokumentation

So wie es aussieht, könnten Sie auf Ihrer docker-compose.yml Folgendes tun

volumes:
    - ./:/app
86
jkris

Es gibt einige Möglichkeiten

Kurze Syntax

Verwendung der Host : guest Format können Sie eine der folgenden Aktionen ausführen:

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Path on the Host, relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/mysql

Lange Syntax

Ab docker-compose v3.2 können Sie eine lange Syntax verwenden, mit der Sie zusätzliche Felder konfigurieren können, die in Kurzform ausgedrückt werden können, z. B. mount type (volume, bind oder tmpfs) und read_only.

version: "3.2"
services:
  web:
    image: nginx:Alpine
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

networks:
  webnet:

volumes:
  mydata:

Weitere Informationen finden Sie unter https://docs.docker.com/compose/compose-file/#long-syntax- .

46
GreensterRox

Es waren zwei Dinge:

Ich habe das Volume in docker-compose.yml Hinzugefügt:

node:
    volumes:
        - ./node:/app

Ich habe die npm install && nodemon app.js - Teile in ein CMD verschoben, weil RUN dem Union File System Dinge hinzufügt und mein Volume nicht Teil von UFS ist.

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <[email protected]>

# Install nodemon
RUN npm install -g nodemon

# Add a /app volume
VOLUME ["/app"]

# Define working directory
WORKDIR /app

# Expose port
EXPOSE  8080

# Run npm install
CMD npm install && nodemon app.js
8
Upvote Me

Wenn Sie ein bestimmtes Host-Verzeichnis mounten möchten (/disk1/prometheus-data im folgenden Beispiel) als Volume im Abschnitt volumes der Docker Compose YAML-Datei können Sie dies wie folgt tun, z.

version: '3'

services:
  prometheus:
    image: prom/prometheus
    volumes:
      - prometheus-data:/prometheus

volumes:
  prometheus-data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /disk1/prometheus-data

Refs:

4
Yuci