Node.js Docker-覆盖链接卷的内容
拥有简单的Node.js docker容器 docker-compose.yml: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
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的答案就可以了,尽管我仍在试图理解,如果您的容器中总是有更新的节点,那么为什么要安装节点_模块?其他容器也在使用它?请在此处查看更改节点安装目录的选项: