【问题标题】:Docker - "Missing script: "dev"" - But it's there?Docker - “缺少脚本:“dev”” - 但它在那里?
【发布时间】:2021-09-20 03:41:41
【问题描述】:

我正在将 Docker Compose 用于 React/Express 应用程序。

服务器的 Dockerfile:

FROM node:latest 
WORKDIR /app/server 
COPY package.json /app/server
COPY package-lock.json /app/server 
RUN npm install 
COPY . /app/server
CMD [ "npm", "run", "dev" ]

客户端的 Dockerfile:

FROM node:latest
WORKDIR /app/client
COPY package.json /app/client
COPY package-lock.json /app/client
RUN npm install
COPY . /app/client
CMD [ "npm", "start" ]

还有我的 docker-compose 文件:

version: '3' 
services:
    server:
        build: ./server
        expose: 
            - "3001"
        ports:
            - "3001:3001"
        volumes:
            - ./server/src/:/app/server
        command: npm run dev
        tty: true

    client:
        build: ./client
        expose:
            - "3000"
        ports:
            - "3000:3000"
        volumes: 
            - ./client/src/:/app/client
        links:
            - server
        command: npm run start
        tty: true

运行“docker-compose up”后服务器崩溃:

npm 错误!缺少脚本:“dev”

但是,我的 package.json 中有一个“开发”脚本:

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "nodemon index.js",
    "start": "node index.js"
  },

这里有什么问题?脚本在那里。我的 Docker 文件有问题吗? “npm run dev”在没有 Docker 的情况下也能正常工作。

谢谢!

【问题讨论】:

    标签: node.js reactjs docker docker-compose


    【解决方案1】:

    嗯,显然,Docker 找不到包含 dev 脚本的 package.json 文件。

    我的第一个建议是确保 package.json 位于项目的根文件夹中,与 docker-compose.yml 处于同一文件夹级别。

    【讨论】:

    • 我的“服务器”文件夹中有一个 package.json 文件,“客户端”文件夹中有一个。服务器文件夹中的那个里面有“dev”脚本。但是如果 docker 找不到它 - 在“docker build”期间“npm install”不应该失败吗?因为它没有。
    • 所以你有两个Dockerfiles,一个在“客户端”内,一个在“服务器”内?
    • 是的,完全正确。每个文件夹一个 Dockerfile。
    • 看起来您在所有“COPY”行的末尾都缺少一个“/”。因此,您将为此编写“COPY package.json /app/server/”,并为所有“COPY”行执行此操作。我不确定 Docker 是否那么脆弱,但可以尝试一下。
    • 不,不幸的是没有工作:(但感谢您的努力!
    【解决方案2】:

    当您的 docker-compose.yml 文件显示时

    volumes:
      - ./server/src/:/app/server
    

    这隐藏了 Dockerfile 在/app/server 目录中所做的一切,并将其替换为该主机目录的内容。由于您的 Dockerfile 所做的唯一事情是在 /app/server 目录中,因此您实际上根本没有使用您的 Docker 映像。

    我通常建议删除这些volumes:,以及其他一些不必要的选项。 (您几乎不需要在 Compose 中使用 expose: 端口;您不需要重复图像中的 command:links: 是过时的网络设置。)您可以将文件缩减为只是

    version: '3.8'
    services:
        server:
            build: ./server
            ports:
                - "3001:3001"
        client:
            build: ./client
            ports:
                - "3000:3000"
    

    如果您确实包含volumes:,您需要确保已安装内容的布局与容器中的内容完全匹配。 (尝试使用和不使用volumes: 行运行docker-compose run server ls。)在这里,您从./server 目录构建映像,然后将其src 子目录安装到整个应用程序上。将其仅安装在容器内的src 子目录上可能会更好

    volumes:
      - ./server/src:/app/server/src
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-03
      • 2012-03-23
      • 2018-04-12
      • 2021-07-25
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多