Bagaimana cara memasang direktori host sebagai volume dalam penulisan buruh pelabuhan

126

Saya memiliki lingkungan pengembangan, saya sedang melakukan docker dan saya ingin kemampuan untuk memuat ulang perubahan saya tanpa harus membangun kembali gambar buruh pelabuhan. Saya menggunakan penulisan galangan kapal karena redis adalah salah satu dependensi aplikasi saya dan saya suka dapat menautkan penampung redis

Saya memiliki dua wadah yang ditentukan di saya docker-compose.yml:

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

redis:
    image: redis
    ports:
        - "6379"

Saya sudah sampai pada titik di nodefile dok aplikasi saya di mana saya menambahkan volume, tetapi bagaimana cara memasang direktori host di volume sehingga semua pengeditan langsung saya pada kode tersebut tercermin dalam penampung?

Inilah Dockerfile saya saat ini:

# 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"]

# 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"]

Proyek saya terlihat seperti ini:

/
- docker-compose.yml
- node-app.env
- node/
  - app.js
  - Dockerfile.js
Amin Shah Gilani
sumber

Jawaban:

137

Lihat dokumentasi mereka

Dari tampilannya, Anda dapat melakukan hal berikut di docker-compose.yml Anda

volumes:
    - ./:/app
jkris
sumber
2
Sudah mencobanya, tidak berhasil:Error: Cannot find module '/data/app.js'
Amin Shah Gilani
2
tunggu .. VOLUME dan WORKDIR Anda menunjukkan /app/mengapa CMD Anda mengarah ke/data
jkris
1
Itu adalah kesalahan! Terima kasih sudah menangkapnya! Diperbaiki, dan sekarang saya mengerti, Error: Cannot find module 'express'saya akan mencoba beberapa hal sekarang.
Amin Shah Gilani
3
Untuk wadah jendela, Anda akan menginginkan jalur gaya jendela seperti - .:c:/app(ini membuat saya tersandung)
JohnnyFun
86

Ada beberapa pilihan

Sintaks Pendek

Dengan menggunakan host : guestformat tersebut, Anda dapat melakukan salah satu hal berikut:

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

Sintaks Panjang

Pada docker-compose v3.2 Anda dapat menggunakan sintaks panjang yang memungkinkan konfigurasi bidang tambahan yang dapat diekspresikan dalam bentuk singkat seperti mount type(volume, bind atau tmpfs) dan 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:

Lihat https://docs.docker.com/compose/compose-file/#long-syntax-3 untuk info lebih lanjut.

GreensterRox
sumber
21

Jika Anda ingin memasang direktori host tertentu ( /disk1/prometheus-datadalam contoh berikut) sebagai volume di volumesbagian file Docker Compose YAML, Anda dapat melakukannya seperti di bawah ini, misalnya:

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

Ngomong-ngomong, di Dockerfile prometheus, Anda dapat menemukan VOLUMEinstruksi seperti di bawah ini, yang menandainya sebagai memegang volume yang dipasang secara eksternal dari host asli, dll. (Namun, perhatikan: instruksi ini bukan suatu keharusan untuk memasang volume ke dalam wadah.) :

Dockerfile

...
VOLUME ["/prometheus"]
...

Referensi:

Yuci
sumber
Ini berhasil. Terima kasih. Di manakah dokumentasi untuk localtipe driver?
mmell
@mmell Dokumentasi adalah tautan Referensi pertama ( docs.docker.com/compose/compose-file/#driver ) Bunyinya: Tentukan driver volume mana yang harus digunakan untuk volume ini. Default untuk driver apa pun yang Mesin Docker telah dikonfigurasi untuk digunakan, yang dalam banyak kasus adalahlocal
Yuci
1
@mmell, Anda dapat menemukan detail lebih lanjut dari pertanyaan ini: stackoverflow.com/questions/42195334/…
Yuci
Bagaimana Anda tahu pengaturannya driver_opts: o: bind type: none?
mmell
1
@mmell Pada dasarnya, opsi-opsi itu bergantung pada driver, dan localdriver bawaan pada Linux menerima opsi yang mirip dengan perintah mount linux: man7.org/linux/man-pages/man8/mount.8.html . Anda dapat menemukan lebih banyak diskusi di github.com/moby/moby/issues/19990#issuecomment-248955005 , dan stackoverflow.com/questions/35841241/…
Yuci
9

Itu dua hal:

Saya menambahkan volume di docker-compose.yml:

node:
    volumes:
        - ./node:/app

Saya memindahkan npm install && nodemon app.jspotongan - potongan itu menjadi CMDkarena RUNmenambahkan sesuatu ke Sistem File Union, dan volume saya bukan bagian dari UFS.

# 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
Amin Shah Gilani
sumber
2

kita harus membuat volume buruh pelabuhan Anda sendiri yang dipetakan dengan direktori host sebelum kami sebutkan di docker-compose.yml sebagai eksternal

1. Buat volume bernama share

docker volume create --driver local \
    --opt type=none \
    --opt device=/home/mukundhan/share \
    --opt o=bind share

2. Gunakan di docker-compose Anda

version: "3"

volumes:
  share:
    external: true

services:
  workstation:
    container_name: "workstation"
    image: "ubuntu"
    stdin_open: true
    tty: true
    volumes:
      - share:/share:consistent
      - ./source:/source:consistent
    working_dir: /source
    ipc: host
    privileged: true
    shm_size: '2gb'
  db:
    container_name: "db"
    image: "ubuntu"
    stdin_open: true
    tty: true
    volumes:
      - share:/share:consistent
    working_dir: /source
    ipc: host

Dengan cara ini kita dapat berbagi direktori yang sama dengan banyak layanan yang berjalan di wadah berbeda

Mukundhan
sumber
mengapa saya harus memiliki ipc: host?
Vahid Noormofidi
yang hanya diperlukan saat kita perlu mengikat jaringan ke host itu sendiri.
Mukundhan