Làm cách nào để gắn kết thư mục máy chủ dưới dạng âm lượng trong docker soạn


125

Tôi có một môi trường phát triển Tôi đang cập bến và tôi muốn có khả năng tải lại các thay đổi của mình mà không phải xây dựng lại hình ảnh docker. Tôi đang sử dụng docker compose vì redis là một trong những phụ thuộc của ứng dụng của tôi và tôi thích có thể liên kết một container redis

Tôi có hai container được định nghĩa trong docker-compose.yml:

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

redis:
    image: redis
    ports:
        - "6379"

Tôi đã đi đến điểm trong nodedockerfile của ứng dụng của mình, nơi tôi thêm một ổ đĩa, nhưng làm cách nào để gắn thư mục của máy chủ vào ổ đĩa để tất cả các chỉnh sửa trực tiếp của tôi vào mã được phản ánh trong vùng chứa?

Đây là Dockerfile hiện tại của tôi:

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

Dự án của tôi trông như thế này:

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

Câu trả lời:


137

Kiểm tra tài liệu của họ

Từ vẻ ngoài của nó, bạn có thể làm như sau trên docker-compose.yml

volumes:
    - ./:/app

2
Đã thử, nó không hoạt động:Error: Cannot find module '/data/app.js'
Amin Shah Gilani

2
chờ đã .. TÌNH NGUYỆN và CÔNG VIỆC /app/của bạn chỉ ra lý do tại sao CMD của bạn trỏ đến/data
jkris

1
Đó là một lỗi! Cảm ơn bạn đã nắm bắt điều đó! Đã sửa, và bây giờ tôi nhận được Error: Cannot find module 'express'tôi sẽ thử một vài thứ bây giờ.
Amin Shah Gilani

3
Đối với các cửa sổ container, bạn sẽ muốn một đường dẫn kiểu cửa sổ như thế - .:c:/appnày (điều này làm tôi vấp ngã)
JohnnyFun

86

Có một vài lựa chọn

Cú pháp ngắn

Sử dụng host : guestđịnh dạng bạn có thể thực hiện bất kỳ thao tác nào sau đây:

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

Cú pháp dài

Kể từ docker-compose v3.2, bạn có thể sử dụng cú pháp dài cho phép cấu hình các trường bổ sung có thể được biểu thị ở dạng ngắn như mount type(âm lượng, liên kết hoặc tmpfs) và 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:

Hãy xem https://docs.docker.com/compose/compose-file/#long-syntax-3 để biết thêm thông tin.


21

Nếu bạn muốn gắn một thư mục máy chủ cụ thể ( /disk1/prometheus-datatrong ví dụ sau) dưới dạng một volumesphần trong phần của tệp Docker Compose YAML, bạn có thể làm như dưới đây, ví dụ:

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

Nhân tiện, trong Dockerfile của prometheus, Bạn có thể tìm thấy VOLUMEhướng dẫn như bên dưới, đánh dấu nó là giữ âm lượng được gắn bên ngoài từ máy chủ gốc, v.v. :

Dockerfile

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

Tham chiếu:


Điều này đã làm việc. Cảm ơn. Tài liệu cho localloại trình điều khiển ở đâu?
mmell

@mmell Tài liệu này là liên kết Refs đầu tiên ( docs.docker.com/compose/compose-file/#do ) Nó đọc: Chỉ định trình điều khiển âm lượng nào sẽ được sử dụng cho âm lượng này. Mặc định cho bất kỳ trình điều khiển nào mà Docker Engine đã được cấu hình để sử dụng, trong hầu hết các trường hợp làlocal
Yuci

1
@mmell, bạn có thể tìm thêm chi tiết từ câu hỏi này: stackoverflow.com/questions/42195334/NH
Yuci

Làm thế nào bạn biết các cài đặt trong driver_opts: o: bind type: none?
mmell

1
@mmell Về cơ bản, các tùy chọn đó phụ thuộc vào localtrình điều khiển và trình điều khiển tích hợp trên Linux chấp nhận các tùy chọn tương tự như lệnh mount linux: man7.org/linux/man-pages/man8/mount.8.html . Bạn có thể tìm thấy nhiều cuộc thảo luận hơn tại github.com/moby/moby/issues/19990#issuecomment-236155005stackoverflow.com/questions353841241/iêu
Yuci

9

Đó là hai điều:

Tôi đã thêm âm lượng vào docker-compose.yml:

node:
    volumes:
        - ./node:/app

Tôi đã chuyển các npm install && nodemon app.jsphần thành một CMDRUNthêm mọi thứ vào Hệ thống tệp Liên minh và tập của tôi không phải là một phần của UFS.

# 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

1

chúng ta phải tạo khối lượng docker của riêng bạn được ánh xạ với thư mục máy chủ trước khi chúng ta đề cập đến trong docker-compose.yml như bên ngoài

1. Tạo khối lượng có tên là chia sẻ

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

2.Sử dụng nó trong docker-compose

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

Bằng cách này, chúng tôi có thể chia sẻ cùng một thư mục với nhiều dịch vụ đang chạy trong các thùng chứa khác nhau


Tại sao tôi cần phải có ipc: máy chủ?
Vahid Noormofidi

điều đó chỉ cần thiết khi chúng ta cần liên kết mạng vào máy chủ.
Mukundhan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.