Docker compose'da bir ana bilgisayar dizinini birim olarak nasıl bağlarım


127

Dockerize ettiğim bir geliştirme ortamım var ve docker görüntülerini yeniden oluşturmak zorunda kalmadan değişikliklerimi tekrar yükleme yeteneğine sahip olmak istiyorum. Redis, uygulamamın bağımlılıklarından biri olduğu için docker compose kullanıyorum ve redis konteynerine bağlanabilmeyi seviyorum

Benimde tanımlanmış iki konteynerim var docker-compose.yml:

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

redis:
    image: redis
    ports:
        - "6379"

nodeUygulamamın dockerfile dosyasında bir birim eklediğim noktaya geldim , ancak ana bilgisayarın dizinini birime nasıl bağlayabilirim, böylece koda yapılan tüm canlı düzenlemelerim kapsayıcıya yansıtılır?

İşte mevcut Dockerfile'ım:

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <amin@gilani.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"]

Projem şuna benziyor:

/
- docker-compose.yml
- node-app.env
- node/
  - app.js
  - Dockerfile.js

Yanıtlar:


137

Belgelerine göz atın

Görünüşe göre docker-compose.yml dosyanızda aşağıdakileri yapabilirsiniz.

volumes:
    - ./:/app

2
Denedim, işe yaramadı:Error: Cannot find module '/data/app.js'
Amin Shah Gilani

2
bekleyin .. VOLUME ve WORKDIR /app//data
değeriniz CMD'nizin

1
Bu bir hataydı! Bunu yakaladığın için teşekkürler! Düzeltildi ve şimdi Error: Cannot find module 'express'birkaç şey deneyeceğim.
Amin Şah Gilani

3
Windows kapsayıcıları için, - .:c:/app(bu beni
tetikledi

88

Birkaç seçenek var

Kısa Sözdizimi

Kullanmak host : guestBiçimi aşağıdakilerden herhangi birini yapabilirsiniz:

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

Uzun Sözdizimi

Docker-compose v3.2'den itibaren, mount type(volume, bind veya tmpfs) ve gibi kısa biçimde ifade edilebilen ek alanların yapılandırılmasına izin veren uzun sözdizimi kullanabilirsiniz 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:

Check out https://docs.docker.com/compose/compose-file/#long-syntax-3 fazla bilgi için.


22

Docker Compose YAML dosyasının bölümünde belirli bir ana bilgisayar dizinini ( /disk1/prometheus-dataaşağıdaki örnekte) bir birim olarak bağlamak volumesisterseniz, bunu aşağıdaki gibi yapabilirsiniz, örneğin:

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

Bu arada, prometheus'un Dockerfile dosyasında, VOLUME yerel ana bilgisayardan harici olarak monte edilmiş birimleri tuttuğunu belirten talimatı aşağıdaki gibi . :

Dockerfile

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

refs:


Bu işe yaradı. Teşekkürler. localSürücü türü için belgeler nerede ?
mmell

@mmell Dokümantasyon ilk Refs bağlantısıdır ( docs.docker.com/compose/compose-file/#driver ) Okur : Bu birim için hangi birim sürücüsünün kullanılması gerektiğini belirtin. Docker Engine'in kullanmak üzere yapılandırıldığı sürücünün varsayılanı, çoğu durumdalocal
Yuci

1
@mmell, bu sorudan daha fazla ayrıntı bulabilirsiniz: stackoverflow.com/questions/42195334/…
Yuci

İçindeki ayarları nasıl bildin driver_opts: o: bind type: none?
mmell

1
@mmell Temel olarak, bu seçenekler sürücüye bağlıdır ve localLinux'taki yerleşik sürücü, linux mount komutuna benzer seçenekleri kabul eder: man7.org/linux/man-pages/man8/mount.8.html . Daha fazla tartışmayı github.com/moby/moby/issues/19990#issuecomment-248955005 ve stackoverflow.com/questions/35841241/…
Yuci

9

İki şeydi:

Sesi ekledim docker-compose.yml:

node:
    volumes:
        - ./node:/app

npm install && nodemon app.jsParçaları bir içine taşıdım CMDçünkü RUNUnion Dosya Sistemine bir şeyler ekliyor ve birimim UFS'nin bir parçası değil.

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <amin@gilani.me>

# 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

2

buna mecbur oluşturmak Kendi liman işçisi hacmini ile eşleştirilmiş konak dizinine daha önce söz de liman işçisi-compose.yml olarak dış

1.Create hacmi adlı payı

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

2. Docker-compose'unuzda kullanın

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

Bu şekilde aynı dizini farklı konteynerlerde çalışan birçok hizmetle paylaşabiliriz.


ipc: host'a neden ihtiyacım var?
Vahid Noormofidi

bu yalnızca ağı ana bilgisayarın kendisine bağlamamız gerektiğinde gereklidir.
Mukundhan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.