构建一个可以执行 npm 任务的网络应用程序

Building an web app which can perform npm tasks

在我 post 任何配置之前,我会尝试解释我想要存档的内容并想提一下,我是 docker 的新手。

为了使路径对话更容易,假设我们谈论项目 "Docker me up!" 并且它位于 X:\docker-projects\docker-me-up\

目标:

我想运行多个不同内容的nginx项目,每个项目代表一个专用构建。在开发过程中 [docker-compose up -d] 容器应该立即更新;效果很好。

棘手的部分是,我想将 npm [http://gruntjs.com] 从我的主机直接外包到 container/image,这样我就可以在任何地方进行调试和开发,只需安装docker。因此,npm必须安装在“服务”中,并且需要初始化一个watcher。

每个项目都封装在 docker 中 host/build 上自己的文件夹中,除了它本身之外,不应该知道任何其他信息。

我的解决方案:

我试过很多不同的版本,有“volumes_from”等。但我决定给你看这个,因为它缩小了但仍然完整。

Docker-compose.yml

version: '2'
services:
    web:
        image: nginx
        volumes:
            - ./assets:/website/assets:ro
            - ./config:/website/config:ro
            - ./www:/website/www:ro
        links:
            - php
    php:
        image: php:fpm
        ports:
            - "9000:9000"
        volumes:
            - ./assets:/website/assets:ro
            - ./config:/website/config:ro
            - ./www:/website/www:ro
    app:
        build: .
        volumes:
            - ./assets:/website/assets
            - ./config:/website/config:ro
            - ./www:/website/www

Docker文件

FROM debian:jessie-slim
RUN apt-get update && apt-get install -y \
    npm

RUN gem update --system
RUN npm install -g grunt-cli grunt-contrib-watch grunt-babel babel-preset-es2015

RUN mkdir -p /website/{assets,assets/es6,config,www,www/js,www/css}

VOLUME /website

WORKDIR /website

问题:

如您所见,“数据”服务包含 npm 并且应该能够执行 npm 命令。但是,如果我 运行 docker-compose up -d 一切正常。我可以编辑页面内容,使用它等等。但是数据容器不是 运行ning,因此无法执行任何 npm 命令。除非我有很大的逻辑错误;这是很有可能的 ;-)

环境:

调用 docker-compose up 后,您可以通过以下方式为 app 容器获取交互式 shell:

docker-compose run app

您还可以 运行 一次性命令:

docker-compose run app [command]

您的 app 容器在 docker-compose up 完成后未 运行ning 的原因是您的 Dockerfile 没有定义服务。对于 app 到 运行 作为服务,您需要通过添加类似以下内容的方式在容器的前台保留一个线程 运行ning:

CMD ./run-my-service

到 Dockerfile 的末尾。