如何在Docker中运行NodeJS命令行工具?

时间:2017-04-18 12:23:05

标签: node.js docker gruntjs docker-compose

上下文

我正在为 dev env 创建一个很棒的Docker Compose。我们使用:

  • nginx的
  • PHP
  • MySQL的
  • MongoDB的

为我们开发的网络应用提供服务。

我们还使用一些使用NodeJS的命令行工具:

  • Grunt(编译SCSS)
  • JS​​Hint

所以我有一个docker-compose.yml和五个Dockerfile(每个服务一个,一个包含NodeJS)。建筑工程。

Docker配置

docker-compose.yml

version: '2'

services:
  web:
    build: ../app-web/
    ports:
     - "80:80"
    tty: true
    # Add a volume to link php code on the host and inside the container
    volumes:
     - /var/www/my_app:/usr/share/nginx/html/my_app
     - /var/www/my_app/docker_files/docker-assistant:/usr/share/nginx/html/assistant
    # Add hostnames to allow devs to call special url to open sites
    extra_hosts:
     - "localhost:127.0.0.1"
     - "assistant.docker:127.0.0.1"
     - "my_app.my_company.dev:127.0.0.1"
    depends_on:
     - custom-php
     - custom-mysql
     - custom-mongo
     - custom-node
    links:
     - custom-php:custom-php
     - custom-mysql:custom-mysql
     - custom-mongo:custom-mongo

  custom-php:
    build: ../app-php/
    ports:
     - "50:50"
    volumes:
     - /var/www/my_app:/usr/share/nginx/html/my_app
     - /var/www/my_app/docker_files/docker-assistant:/usr/share/nginx/html/assistant

  custom-mysql:
    build: ../app-mysql/
    #tty: true
    volumes:
     - /var/lib/mysql:/var/lib/mysql
     - /var/www/my_app/sql:/usr/share/sql
    environment:
     - MYSQL_ROOT_PASSWORD=rootpwd
     - MYSQL_DATABASE=appdb
     - MYSQL_USER=app
     - MYSQL_PASSWORD=apppwd

  custom-mongo:
    build: ../app-mongo/
    volumes:
     - /var/lib/mongodb:/data/db

  custom-node:
    build: ../app-npm/
    tty: true

节点Dockerfile

FROM node:7.8.0-alpine
MAINTAINER DarckCrystale "xxx@xxx.xxx"

CMD [ "node" ]

问题

如何从Docker容器(例如Grunt)运行NodeJS命令行工具?

例如,当我需要编译SCSS而没有Docker时,我会转到我的app文件夹:

cd /var/www/my_app_folder

我跑了咕噜声:

grunt

grunt watch

但我无法弄清楚如何使用我的节点Docker容器执行此操作。

2 个答案:

答案 0 :(得分:2)

使用docker exec,您可以在容器内运行命令,例如:

docker exec my-container-name grunt

更多信息:https://docs.docker.com/engine/reference/commandline/exec/

答案 1 :(得分:1)

您可以在CMD中添加WORKDIRDockerfile来执行相同操作。有关具体示例,请尝试将其添加到Dockerfile

WORKDIR /var/www/my_app_folder
CMD grunt
// or 
CMD grunt watch

有关详情,请参阅Digital Ocean的link

--------------编辑---------------

如果您想根据您的开发方案执行它,请尝试以下操作:

@darkckcrystale I see well I was giving you production level solution, well in dev case try running following


// This will list all the running containers
$ docker ps

// output
CONTAINER ID        IMAGE                        COMMAND                
CREATED              STATUS              PORTS               NAMES
4c01db0b339c        ubuntu:12.04                 bash                   
17 seconds ago       Up 16 seconds       3300-3310/tcp       webapp
d7886598dbe2        crosbymichael/redis:latest   /redis-server --dir    
33 minutes ago       Up 33 minutes       6379/tcp            
redis,webapp/db

$ docker exec -it 4c01db0b339c grunt
// docker exec [options] [container id/name] <command>

有关详细信息,请查看此link