将node.js移动到docker容器,接收无法文件模块错误

时间:2017-11-21 13:03:51

标签: node.js docker-compose dockerfile

我正在尝试为从scr文件夹复制到dist文件夹的typescript转换的api层创建node.js docker容器。 node.js容器似乎立即退出,当我发出docker-compose日志时,我得到“错误:无法找到模块'/usr/src/app/webapp.js'”,但是,当我打开带有 - 的容器时d选项,我可以看到文件和目录结构在正确的层次结构中的位置。这可能有什么问题?为什么节点无法找到webapp.js文件?

Dockerfile:

FROM node:latest

# install our dependencies and nodejs
RUN mkdir -p /usr/src
RUN mkdir -p /tmp/dist

ADD Account/package.json /tmp/package.json
RUN cd /tmp && npm install --production
ADD Account/dist /tmp/dist
RUN mkdir -p /tmp/node_modules/mongodb-repository

ADD Account/node_modules/mongodb-repository /tmp/node_modules/mongodb-repository
RUN mkdir -p /usr/src/app && cp -a /tmp/node_modules /usr/src/app && cp -a /tmp/package-lock.json /usr/src/app
RUN cp -a /tmp/dist/application /usr/src/app && cp -a /tmp/dist/config /usr/src/app && cp -a /tmp/dist/domain /usr/src/app && cp -a /tmp/dist/infrastructure /usr/src/app
RUN cp -a /tmp/dist/routes /usr/src/app && cp -a /tmp/dist/types /usr/src/app && cp -a /tmp/dist/webapp.js /usr/src/app && cp -a /tmp/package.json /usr/src/app
RUN chmod 755 /usr/src/app/webapp.js
RUN mkdir -p /usr/src/app/bin

COPY Account/bin /usr/src/app/bin
COPY Account/.env /usr/src/app/.env

WORKDIR /usr/src/app

CMD [ "node", "webapp.js" ]
EXPOSE 3000

搬运工-compose.yml

version: '2'
services:
 mongo:
    container_name: "app_mongo"
    tty: true
    image: mongo:latest
    environment:
      - MONGO_DATA_DIR=/data/db
      - MONGO_LOG_DIR=/dev/null
      - MONGO_INITDB_ROOT_USERNAME=********
      - MONGO_INITDB_ROOT_PASSWORD=********
    volumes:
      - /data/dbDocker:/data/db
    ports:
        - 27017:27017
    command: "mongod --smallfiles --auth"
 rabbitmq:
    container_name: "app_rabbitmq"
    tty: true
    image: rabbitmq:management
    ports:
      - "15672:15672"
      - "15671:15671"
      - "5672:5672"
    volumes:
      - /rabbitmq/lib:/var/lib/rabbitmq
      - /rabbitmq/log:/var/log/rabbitmq
      - /rabbitmq/conf:/etc/rabbitmq/
 group:
    container_name: "app_group"
    build:
      context: .
      dockerfile: ./Account/Dockerfile
    volumes:
      - ./Account:/usr/src/app/
    ports:
      - "3000:3000"
    depends_on:
      - mongo
      - rabbitmq

1 个答案:

答案 0 :(得分:7)

在构建映像期间,将一些内容安装到/usr/src/app中,然后将其设置为工作目录。以下是来自Dockerfile的行:

RUN mkdir -p /usr/src
RUN mkdir -p /usr/src/app && cp -a /tmp/node_modules /usr/src/app && cp -a /tmp/package-lock.json /usr/src/app
RUN cp -a /tmp/dist/application /usr/src/app && cp -a /tmp/dist/config /usr/src/app && cp -a /tmp/dist/domain /usr/src/app && cp -a /tmp/dist/infrastructure /usr/src/app
RUN cp -a /tmp/dist/routes /usr/src/app && cp -a /tmp/dist/types /usr/src/app && cp -a /tmp/dist/webapp.js /usr/src/app && cp -a /tmp/package.json /usr/src/app
RUN chmod 755 /usr/src/app/webapp.js
RUN mkdir -p /usr/src/app/bin

COPY Account/bin /usr/src/app/bin
COPY Account/.env /usr/src/app/.env

WORKDIR /usr/src/app

在构建阶段之后,所有这些都被烘焙到您的图像中并准备好使用。但是在运行时,你告诉docker-compose:

volumes:
  - ./Account:/usr/src/app/

这是一个叠加装载。无论/usr/src/app中的图像内置了什么,都会被完全忽略,并替换为docker-compose.yml所在目录中./Account的内容。

我不太了解您的项目如何正确地解决这个问题,但这可能是您的错误所在。在构建构建/usr/src/app期间完成的所有工作都是通过在运行时在其上添加另一个目录来撤消的。

如果删除该卷装入,则/usr/src/app的所有内容仍然存在且可以使用。但是,这可能会产生其他副作用,您需要考虑这些副作用才能使您的应用程序发挥作用。