【问题标题】:Docker-compose volume mount before run运行前 Docker-compose 卷挂载
【发布时间】:2016-05-07 13:29:32
【问题描述】:

我有一个来自 docker-compose.yml 的 Dockerfile。

我希望 docker-compose.yml 中的卷挂载发生在 Dockerfile 中的 RUN 之前。

Dockerfile:

FROM node

WORKDIR /usr/src/app

RUN npm install --global gulp-cli \
 && npm install

ENTRYPOINT gulp watch

docker-compose.yml

version: '2'

services:
  build_tools:
    build: docker/gulp
    volumes_from:
      - build_data:rw

  build_data:
    image: debian:jessie
    volumes:
      - .:/usr/src/app

首先执行 Dockerfile,然后从 docker-compose 挂载是完全有意义的,但是有没有办法绕过它。

我想保持 Dockerfile 的通用性,同时从 compose 中传递更具体的位。也许这不是最佳做法?

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    Erik Dannenberg's 是正确的,音量分层意味着我试图做的事情毫无意义。 (如果您想了解更多信息,Docker website 上还有另一个非常好的解释)。如果我想让 Docker 执行npm install,那么我可以这样做:

    FROM node
    
    ADD . /usr/src/app
    WORKDIR /usr/src/app
    
    RUN npm install --global gulp-cli \
     && npm install
    
    CMD ["gulp", "watch"]
    

    但是,这不适合作为我的情况的解决方案。目标是使用 NPM 安装项目依赖项,然后运行 ​​gulp 来构建我的项目。这意味着我需要对项目文件夹的读写权限并且它需要在容器消失后仍然存在。


    在挂载卷之后我需要做两件事,所以我想出了以下解决方案......

    docker/gulp/Dockerfile:

    FROM node
    
    RUN npm install --global gulp-cli
    
    ADD start-gulp.sh .
    
    CMD ./start-gulp.sh
    

    docker/gulp/start-gulp.sh:

    #!/usr/bin/env bash
    
    until cd /usr/src/app && npm install
    do
        echo "Retrying npm install"
    done
    gulp watch
    

    docker-compose.yml:

    version: '2'
    
    services:
      build_tools:
        build: docker/gulp
        volumes_from:
          - build_data:rw
    
      build_data:
        image: debian:jessie
        volumes:
          - .:/usr/src/app
    

    所以现在容器启动一个 bash 脚本,该脚本将不断循环,直到它可以进入目录运行npm install。这仍然很脆弱,但它有效。 :)

    【讨论】:

    【解决方案2】:

    您无法在 Docker 构建期间挂载主机文件夹或卷。允许这样做会损害构建的可重复性。在 Docker 构建期间访问本地数据的唯一方法是构建上下文,它是您传递给 build 命令的 PATHURL 中的所有内容。请注意,Dockerfile 需要存在于上下文中的某个位置。详情请见https://docs.docker.com/engine/reference/commandline/build/

    【讨论】:

    • 为了澄清,根据参考,它会损害构建可重复性^在远程 docker 主机上^。如果您不这样做,我看不到将引用文件预先安排在 docker build 目录中如何使构建更加可重复,但这意味着您需要一些外部构建机制。甚至 docker-compose 也做不到,所以你需要另一个构建级别。更多层 -> 更复杂。愚蠢的。无论如何,如果您希望能够在构建时挂载目录、预定义构建参数并且不向 docker 引入大量其他语法,则可以使用 github.com/CheggEng/dockerx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多