我正在尝试通过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。
作为另一个参考,我可以在Mac上的Docker上运行单元测试,但是在通过连接到Windows 10上用于Windows的Docker的WSL运行它时,得到相同的sh: mocha: not found
。找不到二进制文件node_modules/.bin
的路径,因为我可以启动项目而没有任何错误,它只是找不到任何二进制文件,例如mocha,nsp,gulp等...
答案 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挂载卷时,它实际上并不在乎。您实质上是在更改目录源的映射。