【问题标题】:How to install and work with npm when linking app source in docker-composer?在 docker-compose 中链接应用程序源时如何安装和使用 npm?
【发布时间】:2022-02-21 06:40:20
【问题描述】:

node_modules 的安装顺利通过。

运行docker-compose run --rm npm run dev empty app.js 也不输出错误,一切正常编译。

如果我将它导入到 app.jsApp.vue 没有错误,如果我添加标签或其他 html-tags,我会收到错误:

glob error [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] {
  errno: -13,
  code: 'EACCES',
  syscall: 'scandir',
  path: '/root/.npm/_logs'
}

ERROR in ./resources/js/components/App.vue 1:0
Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
> <template>
|  <div class="container">
| 

webpack compiled with 1 error

我在 docker-compose.xml 中安装了npm,但没有使用 dockerfile:

npm:
    image: node:latest
    container_name: npm
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    entrypoint: ['npm']
    networks:
      - laravel

package.json

{
    "private": true,
    "scripts": {
        "dev": "npm run development",
        "development": "mix",
        "watch": "mix watch",
        "watch-poll": "mix watch -- --watch-options-poll=1000",
        "hot": "mix watch --hot",
        "prod": "npm run production",
        "production": "mix --production"
    },
    "devDependencies": {
        "axios": "^0.21",
        "cross-env": "^7.0.3",
        "laravel-mix": "^6.0.6",
        "lodash": "^4.17.19",
        "postcss": "^8.1.14"
    },
    "dependencies": {
        "npm": "^7.7.5",
        "zlib": "^1.0.5"
    }
}

告诉我,它是如何正确的?

【问题讨论】:

  • 这与 npm 无关,错误来自 webpack。你可以在“你可能需要一个合适的加载器来处理这个文件类型......”的末尾看到它为你提供了一个指向 webpack 文档的链接。
  • 这个设置似乎并没有真正利用 Docker 生态系统。如果你只是在没有 Docker 的主机上运行npm install,你会得到同样的错误吗?

标签: node.js docker npm


【解决方案1】:

您在卷部分链接了您的应用程序源,但您没有包含 node_modules。当我第一次将我的 Node 项目部署到 Docker 时,我也遇到了同样的问题。

要解决此问题,请同时链接您的 node_modules。

如果您想命名该卷,请在 Docker 中创建一个卷并将您的 node_modules 链接到该卷。 https://docs.docker.com/engine/reference/commandline/volume_create/

volumes:
    - ./src:/var/www/html
    - my_node_volume:/var/www/html/node_modules

或者只是链接而不指定,它会自动为您生成该卷。

volumes:
    - ./src:/var/www/html
    - /var/www/html/node_modules

我正在添加一个关于我如何使用它的小例子。

docker-compose.yml

version: "3.8"
services:
    my-app:
        image: eagleclaw/my-app
        container_name: my-app
        ports:
            - 3000:3000
        volumes:
            - /home/eagleclaw/my-app/app:/usr/src/app
            - /usr/src/app/node_modules
        command: ["npm", "start"]
        restart: unless-stopped

Dockerfile

FROM node:latest
WORKDIR /usr/src/app
COPY ./app/ .
RUN npm install
EXPOSE 3000

setup.sh

DOCKER_FILE="/home/eagleclaw/my-app/docker-compose.yml"
APP_DIR="/home/eagleclaw/my-app/app"

docker build --no-cache -f $APP_DIR/Dockerfile -t eagleclaw/my-app $APP_DIR

docker-compose -f $DOCKER_FILE -p app up -d

当我有了这些资源后,我可以简单地转到我的 sh 文件夹并运行它,它会生成 Docker 映像并将其部署到 Docker 容器中。

在我的 Node 项目中,我正在收听 IP 0.0.0.0PORT 3000

【讨论】:

  • could not find expected ':' 自动生成不起作用
  • 对不起,我的错。如果你想自动生成,你应该使用- /var/www/html/node_modules。如果未指定卷,则应删除 :
  • 还编辑了答案。你能再试一次吗?
  • sh: 1: mix: not found 如果我写 - ./ path/to/project/node_modules:/var/www/html/node_modules 那么什么都没有改变,原来的错误
  • 我添加了一个使用示例。我在我的项目中使用这个例子,它对我有用。如果这样做后仍然失败,我无法为您提供帮助。希望它有效,祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多