Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Docker-覆盖链接卷的内容_Node.js_Docker_Dockerfile - Fatal编程技术网

Node.js Docker-覆盖链接卷的内容

Node.js Docker-覆盖链接卷的内容,node.js,docker,dockerfile,Node.js,Docker,Dockerfile,拥有简单的Node.js docker容器 docker-compose.yml: app: build: ./dockerfiles/app volumes: - /Users/home/work/app:/usr/app Dockerfile: FROM node:6.7-slim COPY package.json /tmp RUN cd /tmp && npm install RUN mkdir -p /usr/app WORKDIR /usr/ap

拥有简单的Node.js docker容器

docker-compose.yml:

app:
  build: ./dockerfiles/app
  volumes:
    - /Users/home/work/app:/usr/app
Dockerfile:

FROM node:6.7-slim

COPY package.json /tmp
RUN cd /tmp && npm install

RUN mkdir -p /usr/app
WORKDIR /usr/app

CMD ["node", "./src/app.js"]
FROM node

# Node modules
COPY *.json /tmp/
RUN cd /tmp && yarn
ENV NODE_PATH /tmp/node_modules:${NODE_PATH}

# App
RUN mkdir -p /usr/app
WORKDIR /usr/app
ENV NODE_ENV docker

CMD ["run-node", "src/app.js"]
我想要实现的是一个容器,其中包含package.json和已安装的节点模块(npm install)。我复制package.json并在容器中安装模块的部分非常简单,但当我想在链接的应用程序中使用这些节点_模块时,问题就出现了。我找不到任何方法,如何将/tmp/node_模块复制到/usr/app/node_模块中


码头工人有没有办法做到这一点?如果没有,我可以告诉我的节点应用程序在根目录以外的其他地方查找节点模块吗?

您可以通过更改启动容器时使用的
CMD
,在docker文件或
docker compose.yml
文件中实现您想要的功能

不要只启动
节点。/src/app.js
,您需要做两件事:

  • 复制
    节点\u模块
  • 起始节点
  • 使用
    docker compose.yml
    ,我将执行以下操作:

    app:
      build: ./dockerfiles/app
      volumes:
        - /Users/home/work/app:/usr/app
    command: >
      bash -c "
    
      rm -rf /usr/app/node_modules
      && cp -R /tmp/node_modules /usr/app/node_modules
      && node ./src/app.js
      "
    

    这将删除已映射卷上的现有节点模块,然后从容器中复制这些模块,最后启动节点应用程序。每次启动容器时都会发生这种情况。

    帮助我的是跟踪卷的使用情况

    volumes:
      - ${APP_PATH}:/usr/app
      # Empty node_modules directory
      - /usr/app/node_modules
    
    然后在Dockerfile中:

    FROM node:6.7-slim
    
    COPY package.json /tmp
    RUN cd /tmp && npm install
    
    RUN mkdir -p /usr/app
    WORKDIR /usr/app
    
    CMD ["node", "./src/app.js"]
    
    FROM node
    
    # Node modules
    COPY *.json /tmp/
    RUN cd /tmp && yarn
    ENV NODE_PATH /tmp/node_modules:${NODE_PATH}
    
    # App
    RUN mkdir -p /usr/app
    WORKDIR /usr/app
    ENV NODE_ENV docker
    
    CMD ["run-node", "src/app.js"]
    

    这允许我在另一个目录中有节点模块,应用程序将在那里查找它们。

    正如@schovi所提到的,为了不覆盖容器中节点模块的内容和主机文件夹中节点模块的内容,需要在docker-compose.yml文件中创建另一个内部卷:

    volumes:
      - ${APP_PATH}:/usr/app
      - /usr/app/node_modules
    
    这样做可以安全地使用以下说明将文件从/tmp/node_模块复制到/usr/app/node_模块中

    FROM node
    
    # Node modules
    COPY *.json /tmp/
    RUN cd /tmp && yarn
    
    # App
    RUN mkdir -p /usr/app
    WORKDIR /usr/app
    RUN cp -a /tmp/node_modules /usr/app/node_modules
    ENV NODE_ENV docker
    
    CMD ["run-node", "src/app.js"]
    
    但是,我会首先创建app文件夹并直接在其上安装node_模块,从而大大减少缓存层并提高构建速度

    FROM node:12.8.1 #always mind the version
    
    # Node modules
    RUN mkdir -p /usr/app
    WORKDIR /usr/app
    
    #Mind that point (workdir)
    COPY package*.json .
    RUN yarn
    ENV NODE_ENV docker
    
    CMD ["run-node", "src/app.js"]
    

    我希望有帮助!:D

    使用卷或
    docker cp
    或在docker文件中复制,以防我误解/usr/app是通过卷链接的,但这是在我启动容器时发生的。然后我需要docker用/tmp/node中的内容覆盖/usr/app/node_模块_modules@nwinkler的答案就可以了,尽管我仍在试图理解,如果您的容器中总是有更新的节点,那么为什么要安装节点_模块?其他容器也在使用它?请在此处查看更改节点安装目录的选项: