【问题标题】:How to run NodeJS command-line tools inside Docker?如何在 Docker 中运行 NodeJS 命令行工具?
【发布时间】:2017-04-18 12:23:05
【问题描述】:

上下文

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

  • nginx
  • PHP
  • MySQL
  • MongoDB

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

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

  • Grunt(编译 SCSS)
  • JSHint

所以我有一个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 容器执行此操作。

【问题讨论】:

    标签: node.js docker gruntjs docker-compose


    【解决方案1】:

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

    docker exec my-container-name grunt
    

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

    【讨论】:

    • 这将运行grunt 命令,但是在哪里呢?在集装箱内或我的终端打开的地方?
    • 容器内
    • 是的,你需要在运行 grunt 的容器和主机之间共享/挂载一个卷。
    【解决方案2】:

    您可以通过在您的Dockerfile 中添加CMDWORKDIR 来执行相同的操作。对于您的特定示例,请尝试将其添加到您的 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

    【讨论】:

    • 这将仅在构建 docker compose 时运行 grunt 命令,不是吗?
    • 是的,但如果你想在 docker 准备好后执行它,请查找 RUN 命令,但它只能在 dockerfile 中使用一次,所以我建议你制作一个脚本并运行该脚本使用它
    • 我认为这不是我想要的:我想运行一个命令(例如grunt),只要我想运行它,而不重建容器:/
    • @darckcrystale 我已经根据您的要求更新了我上面的最后一个答案,请检查,它可能会对您有所帮助
    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2012-01-27
    • 2018-05-20
    相关资源
    最近更新 更多