构建一个可以执行 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 命令。除非我有很大的逻辑错误;这是很有可能的 ;-)
环境:
- Windows 10 专业版 [up2date]
- 已使用 docker 的共享驱动器
- Docker 版本 1.12.3,构建 6b644ec
- docker-机器版本0.8.2,build e18a919
- docker-compose version 1.8.1, build 004ddae
调用 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 的末尾。
在我 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 命令。除非我有很大的逻辑错误;这是很有可能的 ;-)
环境:
- Windows 10 专业版 [up2date]
- 已使用 docker 的共享驱动器
- Docker 版本 1.12.3,构建 6b644ec
- docker-机器版本0.8.2,build e18a919
- docker-compose version 1.8.1, build 004ddae
调用 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 的末尾。