Node.js docker compose up未正确运行应用程序

Node.js docker compose up未正确运行应用程序,node.js,angular,docker,docker-compose,Node.js,Angular,Docker,Docker Compose,我对docker很陌生。我有一个mean stack应用程序,并且已经为前端和后端配置了dockerfile,如下所示。当我运行docker compose up时,它似乎完成了,但当我转到localhost时,我收到的是这个而不是我的mean stack应用程序 我真的不知道为什么,但非常感谢您的帮助 后端Dockerfile FROM node MAINTAINER Phil WORKDIR /src COPY . /src RUN npm install RUN npm ins

我对docker很陌生。我有一个mean stack应用程序,并且已经为前端和后端配置了dockerfile,如下所示。当我运行
docker compose up
时,它似乎完成了,但当我转到localhost时,我收到的是这个而不是我的mean stack应用程序

我真的不知道为什么,但非常感谢您的帮助

后端Dockerfile

FROM node

MAINTAINER Phil

WORKDIR /src

COPY . /src

RUN npm install

RUN npm install -g nodemon

EXPOSE 3000

CMD ["npm", "start"]
FROM nginx
MAINTAINER Phil


VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist:usr/share/nginx/html

EXPOSE 80

FROM nginx
MAINTAINER Phil
#optional
RUN rm -rf /usr/share/nginx/html/*

VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist/my-app:usr/share/nginx/html

EXPOSE 80
前端文件

FROM node

MAINTAINER Phil

WORKDIR /src

COPY . /src

RUN npm install

RUN npm install -g nodemon

EXPOSE 3000

CMD ["npm", "start"]
FROM nginx
MAINTAINER Phil


VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist:usr/share/nginx/html

EXPOSE 80

FROM nginx
MAINTAINER Phil
#optional
RUN rm -rf /usr/share/nginx/html/*

VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist/my-app:usr/share/nginx/html

EXPOSE 80
docker-compose.yml

version: '3'
services:
    web:
        build: ./frontend
        ports:
            - "80:80"
        links:
        - node
        volumes:
        - "/Users/Phil/Documents/myapp/myapp-docker/frontend/dist:/usr/share/nginx/html"
    node:
        build: ./backend
        ports:
        - "3000:3000"

控制台输出:

Building node
Gracefully stopping... (press Ctrl+C again to force)
Stopping myapp-docker_web_1 ... done

C:\Users\Phil\Documents\myapp\myapp-docker>docker-compose up --build
Building node
Step 1/8 : FROM node
 ---> 2f1ff44a8bb5
Step 2/8 : MAINTAINER Phil
 ---> Using cache
 ---> 78d7fb0bb77a
Step 3/8 : WORKDIR /src
 ---> Using cache
 ---> 70e753257f23
Step 4/8 : COPY . /src
 ---> Using cache
 ---> 2903a77a03ef
Step 5/8 : RUN npm install
 ---> Using cache
 ---> 582d4f3b0a7b
Step 6/8 : RUN npm install -g nodemon
 ---> Using cache
 ---> 1c9d67ce2743
Step 7/8 : EXPOSE 3000
 ---> Using cache
 ---> 0d77a648b020
Step 8/8 : CMD ["npm", "start"]
 ---> Using cache
 ---> 9adfbe7156f2
Successfully built 9adfbe7156f2
Successfully tagged myapp-docker_node:latest
Building web
Step 1/4 : FROM nginx
 ---> 2073e0bcb60e
Step 2/4 : MAINTAINER Phil
 ---> Using cache
 ---> 1fba608ad1fa
Step 3/4 : VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist:usr/share/nginx/html
 ---> Running in 122358e91315
Removing intermediate container 122358e91315
 ---> 2a54fcb0a4e6
Step 4/4 : EXPOSE 80
 ---> Running in 95117506887d
Removing intermediate container 95117506887d
 ---> 36a7c7bac5b8
Successfully built 36a7c7bac5b8
Successfully tagged myapp-docker_web:latest
Recreating myapp-docker_node_1 ... done
Recreating myapp-docker_web_1  ... done
Attaching to myapp-docker_node_1, myapp-docker_web_1
node_1  |
node_1  | > backend@1.0.0 start /src
node_1  | > node ./package.json
node_1  |
myapp-docker_node_1 exited with code 0
web_1   | 2020/02/06 20:09:02 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.18.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1",
host: "localhost"
web_1   | 172.18.0.1 - - [06/Feb/2020:20:09:02 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0" "-"
Gracefully stopping... (press Ctrl+C again to force)
Stopping myapp-docker_web_1    ... done

backend package.json

{
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./package.json"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "aws-sdk": "^2.612.0",
    "bcrypt": "^3.0.8",
    "body-parser": "^1.19.0",
    "create-hash": "^1.2.0",
    "crypto": "^1.0.1",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "jsonwebtoken": "^8.5.1",
    "mongoose": "^5.8.11",
    "mongoose-unique-validator": "^2.0.3",
    "multer": "^1.4.2",
    "multer-s3": "^2.9.0"
  }
}
这是我的目录布局,以防万一


看起来前端实际上不需要Dockerfile。您肯定必须删除卷声明,但我建议删除整个文件并直接在docker-compose.yml中使用“image:nginx”

由于您不是在构建前端应用程序,因此在运行“docker compose up”之前,您需要确保前端/dist中有index.html

此外,您的后端应用程序无法启动,因为它似乎试图运行
node./package.json
。在
package.json
中检查
start
任务的定义

进行这些更改后,您可以尝试并重新运行docker compose:

version: '3'
services:
    web:
        image: nginx
        ports:
            - "80:80"
        volumes:
        - "/Users/Phil/Documents/myapp/myapp-docker/frontend/dist:/usr/share/nginx/html"
    node:
        build: ./backend
        ports:
        - "3000:3000"
version: '3'
services:
    web:
        build: ./frontend
        ports:
            - "80:80"
        links:
        - node
        volumes:
        - "/Users/Phil/Documents/myapp/myapp-docker/frontend/dist/my-app:/usr/share/nginx/html"
    node:
        build: ./backend
        ports:
        - "3000:3000"

你指向了错误的文件夹。 你的index.html位于/dist/my应用程序中,正如我从你在此处发布的照片中看到的:

修改Dockerfile和docker compose以指向正确的文件夹

构建1 Dockerfile

FROM node

MAINTAINER Phil

WORKDIR /src

COPY . /src

RUN npm install

RUN npm install -g nodemon

EXPOSE 3000

CMD ["npm", "start"]
FROM nginx
MAINTAINER Phil


VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist:usr/share/nginx/html

EXPOSE 80

FROM nginx
MAINTAINER Phil
#optional
RUN rm -rf /usr/share/nginx/html/*

VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist/my-app:usr/share/nginx/html

EXPOSE 80
docker compose:

version: '3'
services:
    web:
        image: nginx
        ports:
            - "80:80"
        volumes:
        - "/Users/Phil/Documents/myapp/myapp-docker/frontend/dist:/usr/share/nginx/html"
    node:
        build: ./backend
        ports:
        - "3000:3000"
version: '3'
services:
    web:
        build: ./frontend
        ports:
            - "80:80"
        links:
        - node
        volumes:
        - "/Users/Phil/Documents/myapp/myapp-docker/frontend/dist/my-app:/usr/share/nginx/html"
    node:
        build: ./backend
        ports:
        - "3000:3000"
构建2(更好) 您也可以忽略docker文件,因为docker compose已指向您的卷,因此您的新docker compose将如下所示:

version: '3'
services:
    web:
        image: nginx
        ports:
            - "80:80"
        links:
        - node
        volumes:
        - "/Users/Phil/Documents/myapp/myapp-docker/frontend/dist/my-app:/usr/share/nginx/html"
    node:
        build: ./backend
        ports:
        - "3000:3000"

你能显示你的前端dist/-文件夹吗?我想知道它是否与我必须浏览的另一个子目录相关,因为它是dist/my app/[files],如果是,我会在哪里进行更改?我也这么想,但在我的测试用例中,即使所有文件都在子文件夹中,原始的nginx index.html也已被删除。“WORKDIR命令用于在任何给定时间定义Docker容器的工作目录。该命令在Dockerfile中指定。任何RUN、CMD、ADD、COPY或ENTRYPOINT命令都将在指定的工作目录中执行。“-->WORKDIR和COPY都使用/src。是否将WORKDIR文件复制到/src/src?如果不使用,
COPY..
就可以了。@Wasbeer虽然是冗余的,但他的副本工作正常,因为他使用的是绝对路径(/src)。如果他写了:COPY../src,你所说的将是正确的。因此,你的建议有助于保持代码整洁,但解释不太正确。dist文件夹中确实有index.html。我用你的docker compose文件替换了我的docker compose文件,尝试将package.json start字段更改为
node server.js
nodemon server.js
,but无法让它通过构建。
nodemon server.js
给了我这个错误。我不确定我应该在开始时做些什么才能让它工作。我还将我的package.json文件添加到了我的原始问题中。如果你的nodejs应用程序坏了,我认为这是另一个线程的问题。如果你想验证我的swer工作,然后在
dist
文件夹中创建一个index.html文件,然后运行
docker compose up
。您将看到该页面而不是nginx主页。通常情况下,dist文件夹是作为构建应用程序的一部分填充的。我认为目录复制不正确。通过添加npm unin,我通过了bcrypt错误暂停bcrypt,然后npm在dockerFile中安装bcrypt,这样就不再是问题了,但似乎在src文件夹postimg.cc/fVQpbHf0的中间件中找不到我的check auth文件。找不到模块“../backend/middleware/check auth path如果我在src文件夹中工作,则路径不正确