Docker在运行之前组合卷安装

Dan*_*elM 27 docker dockerfile docker-compose

我有一个Dockerfile,我指的是docker-compose.yml.

我希望docker-compose.yml中的卷安装发生在Dockerfile之前RUN.

Dockerfile:

FROM node

WORKDIR /usr/src/app

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

ENTRYPOINT gulp watch
Run Code Online (Sandbox Code Playgroud)

泊坞窗,compose.yml

version: '2'

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

  build_data:
    image: debian:jessie
    volumes:
      - .:/usr/src/app
Run Code Online (Sandbox Code Playgroud)

首先完成Dockerfile,然后从docker-compose安装它是完全合理的,但有没有办法解决它.

我想保持Dockerfile的通用性,同时从compose中传递更多特定的位.也许这不是最好的做法?

Dan*_*elM 30

Erik Dannenberg是正确的,音量分层意味着我试图做的事情毫无意义.(如果您想阅读更多内容,Docker网站上还有另一个非常好的解释).如果我想让Docker做,npm install那么我可以这样做:

FROM node

ADD . /usr/src/app
WORKDIR /usr/src/app

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

CMD ["gulp", "watch"]
Run Code Online (Sandbox Code Playgroud)

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


安装卷后我需要做两件事,所以我想出了以下解决方案......

泊坞窗/一饮而尽/ Dockerfile:

FROM node

RUN npm install --global gulp-cli

ADD start-gulp.sh .

CMD ./start-gulp.sh
Run Code Online (Sandbox Code Playgroud)

泊坞窗/一饮而尽/ start-gulp.sh:

#!/usr/bin/env bash

until cd /usr/src/app && npm install
do
    echo "Retrying npm install"
done
gulp watch
Run Code Online (Sandbox Code Playgroud)

泊坞窗,compose.yml:

version: '2'

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

  build_data:
    image: debian:jessie
    volumes:
      - .:/usr/src/app
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你的回答。我试图用 webpack 解决同样的问题。/sf/ask/2874113511/#41075389 (2认同)

Eri*_*erg 15

在Docker构建期间无法装入主机文件夹或卷.允许这会损害构建的可重复性.码头工人在生成过程中访问本地数据的唯一途径是构建背景下,这是在一切PATHURL您传递到build命令.请注意,Dockerfile需要存在于上下文中的某个位置.有关详细信息,请参阅https://docs.docker.com/engine/reference/commandline/build/.