拥有简单的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吗?
答案 0 :(得分:1)
您可以通过在Dockerfile或CMD
文件中更改启动容器时使用的docker-compose.yml
来实现您的目的。
您不想只是启动node ./src/app.js
,而是想做两件事:
node_modules
结束。使用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,应用程序将在那里查找它们。