我正在与docker一起练习创建具有持续交付功能的应用程序。我似乎找不到正确的定义来存储命令。
这是我的docker文件:
FROM node:8
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD node index.js
EXPOSE 3000
WORKDIR :这是Docker容器中还是Windows上的工作目录?
COPY :如我所读,这应该将应用程序复制到工作目录中。我知道了,但是需要什么呢?我应该在这里定义我的应用程序吗?例如,在我的D:/驱动器上
RUN :好的,这将安装软件包依赖项。
COPY :另一个副本,这是我将应用程序路径复制到容器的位置吗?
CMD :据我了解,这可以运行应用程序index.js;再次,我应该定义绝对路径吗?
我想将我的react应用程序泊坞窗化,例如在以下路径中:D:// storage / application
这是我的React应用程序的文件结构:
application
└─ node_modules
└─ "some files"
└─ public
└─ index.html
└─ src
└─ index.js
└─ app.js
└─ Dockerfile
└─ package.json
└─ package-lock.json
现在在这种情况下我应该如何定义Dockerfile?我看到所有带有相对路径的dockerfile,该怎么办? 因为上面的dockerfile有错误:
D:\ storage \ application>泊坞窗 运行-p 3000:3002 dockertest
module.js:550 throw err; ^ Error: Cannot find module '/app/index.js' at Function.Module._resolveFilename (module.js:548:15) at Function.Module._load (module.js:475:25) at Function.Module.runMain (module.js:694:10) at startup (bootstrap_node.js:204:16) at bootstrap_node.js:625:3
存储\应用程序> docker 运行-p 3000:3002码头
/app/src/index.js:1 (function (exports, require, module, __filename, __dirname) { import React from 'react'; SyntaxError: Unexpected token import at createScript (vm.js:80:10) at Object.runInThisContext (vm.js:139:10) at Module._compile (module.js:617:28) at Object.Module._extensions..js (module.js:664:10) at Module.load (module.js:566:32) at tryModuleLoad (module.js:506:12) at Function.Module._load (module.js:498:3) at Function.Module.runMain (module.js:694:10) at startup (bootstrap_node.js:204:16) at bootstrap_node.js:625:3
答案 0 :(得分:0)
您从node index.js
运行WORKDIR
,因此从/app
运行。但是/app
中没有index.js文件。它位于/app/src
中。
您可以像这样CMD node src/index.js
更改CMD,也可以通过npm run
或类似的方式启动应用。
请注意,Docker容器内的文件系统与Windows文件系统是隔离的。因此,Docker不必了解Windows上的C:/ D:驱动器
答案 1 :(得分:0)
index.js文件位于src目录中,因此CMD应为节点src / index.js
FROM node:8
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD ["node", "src/index.js"]
EXPOSE 3000
一种更好的方法是在package.json中定义一个启动脚本,并将cmd更改为[“ npm”,“ start”],这样Dockerfile便不依赖于文件树。