找不到WSL节点路径?卷似乎已安装

时间:2018-06-26 18:13:40

标签: node.js docker docker-compose windows-subsystem-for-linux npm-scripts

我正在尝试通过docker compose设置单元测试运行时间。当我尝试通过docker-compose运行npm脚本时,Node的行为就像它在路径上找不到模块一样:

➜ docker-compose run --rm server npm run test
Starting redis ... done
Starting mongodb ... done

> evolved@1.0.0 test /server
> mocha --recursive tests

sh: mocha: not found
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! evolved@1.0.0 test: `mocha --recursive tests`
npm ERR! spawn ENOENT

我已经确认文件正在装入容器中,那么为什么Node找不到它们?

➜  dc run --rm --service-ports server ls node_modules/.bin | grep "mocha"
Starting redis   ... done
_mocha                  mocha

我的package.json中的脚本非常基本:

    "test": "mocha --recursive tests",
    "build": "gulp default:dev",

docker-compose.yml

version: '3' #compose version
services:
  server:
    build:
      context: .
      dockerfile: Dockerfile.test
    ports:
     - "3000:3000"
    volumes:
     - ".:/server"
    working_dir: "/server"
    depends_on:
      - mongodb
      - redis
    environment:
      PORT: 3000
      NODE_ENV: test
  mongodb:
    image: mongo:latest
    container_name: "mongodb"
    environment:
      - MONGO_DATA_DIR=/data/db
      - MONGO_LOG_DIR=/dev/null
    volumes:
      - ./localdata/db:/data/db
    ports:
        - 27017:27017
    command: mongod --smallfiles --logpath=/dev/null # --quiet
  redis:
    container_name: redis
    command: redis-server --requirepass testredispassword
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - ./localdata/redis:/data
    entrypoint: redis-server --appendonly yes
    restart: always

Dockerfile.test与prod dockerfile的不同之处在于,它不安装/构建应用程序的前端,也不传递任何版本信息。我正在尝试使其运行服务器的单元测试所需的内容更快地构建起来:

FROM node:8-alpine

RUN apk update \
    && apk --update --no-cache add \
        git \
        python \
        build-base

ADD ./ /server WORKDIR /server

RUN rm -rf node_modules && npm install && npm run build

我认为这很简单,我之前也做过类似的设置,但是在Mac的Docker上。这次,我正在运行Docker For Windows并通过WSL运行命令。我已经共享驱动器并将/ mnt / c绑定到/ c。

作为另一个参考enter image description here,我可以在Mac上的Docker上运行单元测试,但是在通过连接到Windows 10上用于Windows的Docker的WSL运行它时,得到相同的sh: mocha: not found。找不到二进制文件node_modules/.bin的路径,因为我可以启动项目而没有任何错误,它只是找不到任何二进制文件,例如mocha,nsp,gulp等...

2 个答案:

答案 0 :(得分:1)

我遇到了类似的情况,这与在WSL / Docker中创建符号链接有关。根据这份Github issue报告给MS的信息,您需要做的就是在系统设置中启用“开发人员模式”。

编辑: Microsoft article介绍了如何在Windows 10计算机上启用开发人员模式。

答案 1 :(得分:0)

类似的声音类似于我在Windows / WSL环境中遇到的路径问题。尝试将卷定义更改为完整路径,看看是否可以解决。

volumes:
 - /c/Users/username/Code/server:/server

即使您已经使用Dockerfile将文件复制到了容器中,但是当使用docker-compose挂载卷时,它实际上并不在乎。您实质上是在更改目录源的映射。