代码之家  ›  专栏  ›  技术社区  ›  kovac

带有Docker的NodeJS:enoint:没有这样的文件或目录,请打开“/应用程序/文件夹/示例”。键'

  •  1
  • kovac  · 技术社区  · 7 年前

    我主要是想了解如何在构建NodeJS应用程序时解决问题/了解文件如何打包到docker容器中。我有一个NodeJS项目,其目录结构如下:

    enter image description here

    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'))
    

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

    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容器,它可以正常工作。有人能帮忙吗?谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   kovac    7 年前

    问题的原因是我没有复制 ssl docker映像生成期间的文件夹。为了确保在构建过程中复制此文件夹,我需要添加 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", "."]