【问题标题】:docker-compose up not running app correctlydocker-compose up 未正确运行应用程序
【发布时间】:2022-04-20 11:05:35
【问题描述】:

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

我不太清楚为什么,但感谢任何帮助。

后端 Dockerfile

FROM node

MAINTAINER Phil

WORKDIR /src

COPY . /src

RUN npm install

RUN npm install -g nodemon

EXPOSE 3000

CMD ["npm", "start"]

前端 Dockerfile

FROM nginx
MAINTAINER Phil


VOLUME /Users/Phil/Documents/myapp/myapp-docker/frontend/dist: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

后端包.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"
  }
}

这是我的目录布局,以防万一

【问题讨论】:

  • 你能显示你的前端 dist/-folder 吗?
  • 我想知道它是否与我必须浏览的另一个子目录有关,因为它是 dist/my-app/[files] postimg.cc/MntD9mFM 如果是这样,我将在哪里进行更改?
  • 我也是这么想的,但是在我的测试用例中,即使所有文件都在子文件夹中,原始的 nginx index.html 也已被删除。
  • "WORKDIR 命令用于定义 Docker 容器在任何给定时间的工作目录。该命令在 Dockerfile 中指定。任何 RUN 、 CMD 、 ADD 、 COPY 或 ENTRYPOINT 命令都将是在指定的工作目录中执行。” --> 您将 /src 用于 WORKDIR 和 COPY。您想将 WORKDIR 文件复制到 /src/src 吗?如果没有,COPY . . 可以。
  • @Wasbeer 虽然多余,但他的 COPY 工作正常,因为他使用绝对路径 (/src)。如果他写道,您所说的将是正确的: COPY 。 ./src.所以你的建议保持代码干净是有道理的,但解释并不完全正确。

标签: node.js angular docker docker-compose


【解决方案1】:

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

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

您的后端应用程序也无法启动,因为它看起来像是在尝试运行node ./package.json。检查package.jsonstart 任务的定义。

进行这些更改后,您可以尝试重新运行 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"

【讨论】:

  • dist 文件夹中确实包含 index.html。我用你的替换了我的 docker-compose 文件,尝试将 package.json 开始字段更改为 node server.jsnodemon server.js ,但无法让它通过构建。 nodemon server.js 给了我这个错误postimg.cc/5jZtNVY9。我不太确定我应该把它放在什么下面才能让它工作。我还将上面的 package.json 文件添加到我原来的问题中。
  • 如果您的 nodejs 应用程序损坏,我认为这是另一个线程的问题。如果您想验证我的答案是否有效,请在您的 dist 文件夹中创建一个文件 index.html 并运行 docker-compose up。您将看到该页面而不是 nginx 主页。通常 dist 文件夹是作为构建应用程序的一部分填充的。
  • 我认为目录没有被正确复制。我通过在 dockerFile 中添加 npm uninstall bcrypt 然后 npm install bcrypt 传递了 bcrypt 错误,因此这不再是问题,但它似乎没有在 src 文件夹 postimg.cc/fVQpbHf0 的中间件中找到我的 check-auth 文件。如果我在 src 文件夹中工作,找不到模块 '../backend/middleware/check-auth 路径将不正确
【解决方案2】:

您指向错误的文件夹。 您的 index.html 位于 /dist/my-app 中,就像我从您在此处发布的照片​​中看到的那样: https://postimg.cc/MntD9mFM.

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

构建 1

Dockerfile

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

码头工人撰写:

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(更好)

您也可以忽略 Dockerfile,因为 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"

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2019-04-21
    • 2017-10-15
    • 2021-08-15
    • 2021-06-13
    • 2023-03-09
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多