3

我使用 Laradock 创建了一个 Laravel 项目。当我运行 npm install 时,我得到以下输出。

> node-sass@4.9.0 install /var/www/npmtest/node_modules/node-sass
> node scripts/install.js

fs.js:119
    throw err;
    ^

Error: EINVAL: invalid argument, open '/var/www/npmtest/node_modules/node-sass/package.json'
    at Object.openSync (fs.js:443:3)
    at Object.readFileSync (fs.js:348:35)
    at Object.Module._extensions..json (internal/modules/cjs/loader.js:719:20)
    at Module.load (internal/modules/cjs/loader.js:612:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
    at Function.Module._load (internal/modules/cjs/loader.js:543:3)
    at Module.require (internal/modules/cjs/loader.js:650:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/var/www/npmtest/node_modules/node-sass/lib/extensions.js:7:9)
    at Module._compile (internal/modules/cjs/loader.js:702:30)
npm WARN rollback Rolling back is-fullwidth-code-point@1.0.0 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/var/www/npmtest/node_modules/gauge/node_modules/is-fullwidth-code-point'
npm WARN rollback Rolling back is-fullwidth-code-point@1.0.0 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/var/www/npmtest/node_modules/sass-graph/node_modules/is-fullwidth-code-point'
npm WARN rollback Rolling back chalk@1.1.3 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/var/www/npmtest/node_modules/node-sass/node_modules/chalk'
npm WARN rollback Rolling back string-width@1.0.2 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/var/www/npmtest/node_modules/gauge/node_modules/string-width'
npm WARN rollback Rolling back chalk@1.1.3 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/var/www/npmtest/node_modules/har-validator/node_modules/chalk'
npm WARN rollback Rolling back assert-plus@1.0.0 failed (this is probably 

……………………

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! node-sass@4.9.0 install: `node scripts/install.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the node-sass@4.9.0 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-06-22T04_51_41_566Z-debug.log

基本上它无法运行 npm install 命令。如果我在 docker 之外创建 Laravel 项目,它会完美运行。有人知道为什么吗?

4

3 回答 3

4

我也遇到了这个问题。我不知道什么时候引入了这个问题,因为我相信我以前能够npm install在这个项目上运行,但我总是可以使用yarn install它(这似乎有效)。

但是,我们正在尝试使用 npm,所以我需要让它工作。

在docker for windows github repo上有一个与此相关的问题。问题似乎是当使用 CIFS 3.02 而不是 CIFS 2.0 安装卷时。Laradock 正在为卷使用绑定挂载,看起来它们默认为 3.02。

我不是 docker 专家,所以可能有更好的方法来解决这个问题,但我能够弄清楚如何更新docker-compose.yml以使用 CIFS 2.0 创建卷,它为我解决了这个问题。

在该volumes:部分下,添加一个新卷。您可以将其命名为任何名称,除了现有定义的卷之一。我打电话给我code的。

Laradock 版本 >= 7.0.0docker-compose.yml文件使用版本 3,并且顶层volumes:部分定义在文件顶部附近。

Laradock 版本 < 7docker-compose.yml文件使用版本 2,顶层volumes:部分定义在文件底部。

不幸的是,由于此卷定义在构建上下文之外,因此您需要硬编码代码的路径;您将无法使用该APP_CODE_PATH_HOST变量(或APPLICATION在 < 7 中)。

您的volumes:部分将如下所示:

volumes:
  mysql:
    driver: ${VOLUMES_DRIVER} (or "local")
  percona:
    driver: ${VOLUMES_DRIVER} (or "local")
  [other volumes removed for brevity...]
  code:
    driver: "local"
    driver_opts:
      type: cifs
      device: //10.0.75.1/C/path/to/your/code/
      o: "rw,relatime,vers=2.0,sec=ntlmsspi,cache=strict,username=[your user name],password=[your password],domain=[your domain, if any; otherwise remove this],uid=0,noforceuid,gid=0,noforcegid,addr=10.0.75.1,file_mode=0755,dir_mode=0755,iocharset=utf8,nounix,serverino,mapposix,nobrl,mfsymlinks,noperm,rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1"

您需要device:使用代码路径更新该选项,并且您需要更新该o:选项以填写您的用户名、密码和域。随意在您的.env文件中创建变量并在此处使用这些变量。

定义新卷后,您需要更新workspace服务以使用新卷。

Laradock 版本 >= 7.0.0:在volumes:您的workspace服务部分,替换${APP_CODE_PATH_HOST}为您的新卷的名称(例如code)。您的workspace卷定义将如下所示:

      volumes:
        - code:${APP_CODE_PATH_CONTAINER}

Laradock 版本 < 7:在volumes:您的applications服务部分,替换${APPLICATION}为您的新卷的名称(例如code)。如果您的applications服务没有volumes:部分,请添加它。您的applications部分定义将如下所示:

      applications:
        image: tianon/true
        volumes:
          - code:/var/www

现在,当您启动容器并登录到workspace容器时,应该使用 CIFS 2.0 挂载您的卷。您可以通过运行验证mount | grep cifs并查看vers=2.0选项中的说明。

node-sass的安装脚本现在应该可以找到 package.json 文件了。假设您没有遇到任何其他错误,npm install应该可以工作。

于 2018-09-17T15:47:15.333 回答
2

我也遇到了 laradock 的同样问题,虽然我没有使用 NPM 的解决方案。它应该可以使用yarn install我没有足够的知识来知道为什么会发生这种情况,但我希望它会有所帮助:)!

于 2018-06-30T00:44:04.317 回答
-1

尝试重建工作区容器:

docker-compose build workspace
于 2018-07-05T01:28:49.220 回答