【问题标题】:NodeJS with Docker: ENOENT: no such file or directory, open '/app/folder/example.key'带有 Docker 的 NodeJS:ENOENT:没有这样的文件或目录,打开“/app/folder/example.key”
【发布时间】:2017-12-19 05:17:37
【问题描述】:

我主要是想了解在构建 NodeJS 应用程序时如何排除故障/了解如何将文件打包到 docker 容器中。我有一个具有以下目录结构的 NodeJS 项目:

docker文件内容如下:

FROM node:8.7-alpine as build
RUN npm install --global typescript webpack
ENV NODE_ENV=development NODE_PATH=/app
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN tsc -p .
RUN webpack

FROM node:8.7-alpine
ENV NODE_ENV=production NODE_PATH=/app
RUN apk add --no-cache \
    udev \
    ttf-freefont \
    chromium \
    fontconfig pango-dev libxcursor libxdamage cups-libs dbus-libs libxrandr gconf-dev libxscrnsaver libc6-compat
WORKDIR /app
COPY package.json .
RUN npm install

COPY --from=build /app/build .
CMD ["node", "."]

index.ts 文件中,我有一行:

key: fs.readFileSync(path.join(__dirname, './../ssl/example.key'))

我尝试将上面的行更改为

key: fs.readFileSync(path.join(__dirname, '../ssl/example.key'))

但是没有用。我还尝试在 src 文件夹中移动 ssl 目录并使用下面的行仍然没有成功:

key: fs.readFileSync(path.join(__dirname, 'ssl/example.key'))

此行导致以下错误:

Error: ENOENT: no such file or directory, open '/app/ssl/example.key'
    at Object.fs.openSync (fs.js:653:18)
    at Object.fs.readFileSync (fs.js:554:33)
    at Object.<anonymous> (/app/index.js:15:13)
    at Module._compile (module.js:624:30)
    at Object.Module._extensions..js (module.js:635:10)
    at Module.load (module.js:545:32)
    at tryModuleLoad (module.js:508:12)
    at Function.Module._load (module.js:500:3)
    at Function.Module.runMain (module.js:665:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

我想这是因为应用程序目录在放入 docker 容器时的打包方式。如果没有 docker 容器,它可以正常工作。任何人都可以帮忙吗?谢谢。

【问题讨论】:

    标签: node.js docker dockerfile


    【解决方案1】:

    此问题的原因是我在构建 docker 映像期间没有复制 ssl 文件夹。为了确保在构建过程中复制此文件夹,我需要将 COPY 添加到我的 Dockerfile 中。所以,最终的 Dockerfile 看起来像:

    FROM node:8.7-alpine as build
    RUN npm install --global typescript webpack
    ENV NODE_ENV=development NODE_PATH=/app
    WORKDIR /app
    COPY package.json .
    RUN npm install
    COPY . .
    RUN tsc -p .
    RUN webpack
    
    FROM node:8.7-alpine
    ENV NODE_ENV=production NODE_PATH=/app
    RUN apk add --no-cache \
        udev \
        ttf-freefont \
        chromium \
        fontconfig pango-dev libxcursor libxdamage cups-libs dbus-libs libxrandr gconf-dev libxscrnsaver libc6-compat
    WORKDIR /app
    # This was the missing line:
    COPY ssl /ssl
    COPY package.json .
    RUN npm install
    
    COPY --from=build /app/build .
    CMD ["node", "."]
    

    【讨论】:

    • 但是通过在第二步中运行 install,您将删除整个构建步骤,并最终得到一个更大的容器。
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 2016-09-17
    • 2019-01-19
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多