添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何在docker compose中把主机目录挂载为一个卷?

317 人关注

我有一个正在进行docker化的开发环境,我希望能够在不重建docker镜像的情况下livereload我的变化。我使用docker compose是因为redis是我的应用程序的一个依赖项,我希望能够链接redis容器

我的 docker-compose.yml 中定义了两个容器。

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

我已经在我的node应用程序的docker文件中添加了一个卷,但我如何在卷中挂载主机的目录,以便我对代码的所有实时编辑都反映在容器中?

Here's my current Dockerfile:

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

My project looks like this:

- docker-compose.yml - node-app.env - node/ - app.js - Dockerfile.js
docker
docker-compose
docker-volume
Amin Shah Gilani
Amin Shah Gilani
发布于 2016-12-01
8 个回答
jkris
jkris
发布于 2022-11-13
已采纳
0 人赞同

Checkout their 文件

From the looks of it you could do the following on your docker-compose.yml

volumes:
    - ./:/app

其中./是主机目录,/app是容器的目标目录。

EDIT:
Previous 文件 source now leads to version history, you'll have to select the version of compose you're using and look for the reference.

v3 / v2 / v1

题外话:从这次编辑开始,所有版本的语法都保持不变

Tried it, it didn't work: Error: Cannot find module '/data/app.js'
等等,你的VOLUME和WORKDIR都指向 /app/ ,为什么你的CMD指向 /data
那是一个错误!谢谢你发现了这个问题!修正了,现在我得到了 Error: Cannot find module 'express' 。我现在要尝试一些东西。
对于windows容器,你需要一个windows风格的路径,如 - .:c:/app (这让我很困惑)。
题外话。如果你需要在主机目录之上挂载1个目录,只需使用标准的 .. 语法。 - ../:/app 适用于Linux容器, - ..\:\app 适用于Windows容器。至少对我来说,它在Docker引擎20.10.11中是有效的。
GreensterRox
GreensterRox
发布于 2022-11-13
0 人赞同

有几个选择

Short Syntax

使用 host : guest 的格式,你可以做以下任何一项。

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

Long Syntax

从docker-compose v3.2开始,你可以使用长语法,它允许配置可以用简短形式表达的额外字段,如mount type(volume, bind or tmpfs)和read_only

version: "3.2"
services:
    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 for more info.

为了补充你的答案,在短语法中还有 :cached :delegated 的注释。如果主机是Docker Desktop for Mac,这些就很重要。它们被记录在 docker-docs.netlify.app/docker-for-mac/osxfs-caching 但不幸的是,在Docker Compose的文档中没有。
Yuci
Yuci
发布于 2022-11-13
0 人赞同

如果你想在Docker Compose YAML文件的 /disk1/prometheus-data 部分挂载一个特定的主机目录( /disk1/prometheus-data 在下面的例子中)作为卷,你可以像下面这样做,例如:。

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

顺便说一下,在Prometheus的Docker文件中,你可以找到VOLUME指令,将其标记为持有来自本地主机的外部挂载的卷,等等(但是请注意:这个指令并不是挂载卷到容器中的必要条件)。

Dockerfile

VOLUME ["/prometheus"]

Refs:

  • https://docs.docker.com/compose/compose-file/compose-file-v3/#driver
  • https://docs.docker.com/compose/compose-file/compose-file-v3/#driver_opts
  • 这很有效。谢谢。 local 驱动类型的文档在哪里?
    Yuci
    @mmell 文档是第一个Refs链接( docs.docker.com/compose/compose-file/#driver )它写道。指定这个卷应该使用哪个卷的驱动。默认为Docker引擎配置使用的任何驱动,在大多数情况下是 local
    Yuci
    @mmell,你可以从这个问题中找到更多细节。 stackoverflow.com/questions/42195334/...
    Yuci
    @mmell 基本上,这些选项是依赖于驱动的,Linux上内置的 local 驱动接受类似于linux mount命令的选项。 man7.org/linux/man-pages/man8/mount.8.html .你可以在以下网站找到更多讨论 github.com/moby/moby/issues/19990#issuecomment-248955005 ,以及 stackoverflow.com/questions/35841241/...
    这个答案应该是关于如何在多个容器中挂载主机目录的单独问题的公认答案;很难找到这个答案。
    Amin Shah Gilani
    Amin Shah Gilani
    发布于 2022-11-13
    0 人赞同

    这是两件事。

    我在 docker-compose.yml 中添加了音量。

    node:
      volumes:
        - ./node:/app
    

    我把npm install && nodemon app.js件移到了CMD里,因为RUN把东西加到了Union File System里,而我的卷不是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
        
    Mukundhan
    Mukundhan
    发布于 2022-11-13
    0 人赞同

    我们必须 创建 your own docker volume host directory before we mention in the docker-compose.yml 作为 外部

    1.创建名为 分享

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

    2.Use it in your 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'
        container_name: "db"
        image: "ubuntu"
        stdin_open: true
        tty: true
        volumes:
          - share:/share:consistent
        working_dir: /source
        ipc: host
    

    This way we can 分享 the same directory with many services running in different containers

    为什么我需要有ipc: host?
    只有当我们需要将网络绑定到主机本身时才需要。
    Good man
    Good man
    发布于 2022-11-13
    0 人赞同

    在docker-compose.yml中,你可以使用这种格式。

    volumes:
        - host directory:container directory
    

    按其文件

    这个 volume 是属于 services 部分还是独立的部分?
    XpressGeek
    XpressGeek
    发布于 2022-11-13
    0 人赞同

    下面是我在Node.js应用程序和MongoDB数据库的工作实例。

    docker-compose.yml

    version: '3'
    services: 
        my-app:
            container_name: my-app-container
            restart: always
            build: .
            volumes:
                - './storage:/usr/src/app/storage'
            ports: 
                - "3000:3000"
            links:
                - my-app-db
        my-app-db:
            container_name: my-app-db-container
            image: mongo
            restart: always
            volumes:
                - './data:/data/db'          
            ports:
                - "27017:27017"
    

    Dockerfile

    FROM node:16.13.2
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    COPY package.json ./
    RUN npm install
    COPY . /usr/src/app/
    EXPOSE 3000
    CMD [ "npm", "start"]
        
    infiniteLearner
    infiniteLearner
    发布于 2022-11-13
    0 人赞同

    分享redis golang docker-compose.yaml

    version: '3.0'
    services:
      redisdb:
        image: redis:6.0
        restart: always
        ports:
          - "6379:6379"
        container_name: redisdb-container
        command: ["redis-server", "--bind", "redisdb", "--port", "6379"]
      urlshortnerservice:
        depends_on:
          - redisdb
        ports:
          - "7777:7777"
        restart: always