Docker - 覆盖链接卷的内容

时间:2016-10-10 12:46:40

标签: node.js docker dockerfile

拥有简单的Node.js泊坞窗容器

搬运工-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"]

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

有没有Docker方式可以做到这一点?如果没有,我可以告诉我的节点应用程序在根目录以外的其他地方寻找node_modules吗?

3 个答案:

答案 0 :(得分:1)

您可以通过在Dockerfile或CMD文件中更改启动容器时使用的docker-compose.yml来实现您的目的。

您不想只是启动node ./src/app.js,而是想做两件事:

  1. 复制node_modules结束。
  2. 启动节点
  3. 使用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
      "
    

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

答案 1 :(得分:1)

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

volumes:
  - ${APP_PATH}:/usr/app
  - /usr/app/node_modules

这样做可以确保按照以下说明将文件从/ tmp / node_modules复制到/ usr / app / node_modules中。

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_modules,从而显着减少缓存层并提高构建速度。

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

答案 2 :(得分:0)

帮助我的是跟随卷的使用

volumes:
  - ${APP_PATH}:/usr/app
  # Empty node_modules directory
  - /usr/app/node_modules

然后在Dockerfile中:

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"]

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