【问题标题】:How is the Dockerfile set up?Dockerfile 是如何设置的?
【发布时间】:2018-10-09 08:50:02
【问题描述】:

我正在使用 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;我应该再次定义绝对路径吗?


总结

我想 dockerize 我的反应应用程序,例如在这个路径中: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:\存储\应用程序>码头工人 运行 -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

在 Ignacio Millán 的解决方案之后更新

存储\应用程序>码头工人 运行 -p 3000:3002 dockert

/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

【问题讨论】:

  • 看起来像是代码本身的问题。 Cannot find module '/app/index.js' 是绝对路径,docker 不会改变它。如果您正确使用了相对路径,它应该可以与 docker 一起使用,因为 »唯一« 的区别是您的应用程序的根目录在 docker 容器内的 »somwhere else«
  • 但是这个 D 盘不是我的主盘,那么 Docker 怎么知道它必须从 D 盘而不是我的 C 盘运行?
  • Docker 不会从任何驱动器运行,它运行的容器在您的情况下是基于 linux 的。此外,它会挂载卷或将数据复制到这些容器中,为此 docker 需要一个 »context«,默认情况下是当前目录。我猜你从你的项目目录中运行了docker build 或docker run。这就是为什么 docker »知道«所有东西在哪里。

标签: reactjs docker continuous-integration cd continuous


【解决方案1】:

你从WORKDIR 运行node index.js,所以从/app 运行。但是/app 中没有 index.js 文件。它位于/app/src。

您可以像这样更改您的 CMD:CMD node src/index.js,或者您通过 npm run 或类似的方式启动您的应用程序。

请注意,Docker 容器内的文件系统与 Windows 文件系统是隔离的。所以 Docker 不必知道你在 Windows 上的 C:/D: 驱动器

【讨论】:

  • 那么 WORKDIR /app 来自 Windows 文件系统?因为我假设该命令意味着在 Docker 容器文件系统中创建一个目录。现在我在哪里将我的应用程序从 Windows 添加到 Docker?
  • WORKDIR 是启动 CMD 的 docker-image 中的目录。您可以使用 COPY 命令将应用程序添加到 docker。每个 COPY 命令的左侧部分指的是 Windows 文件系统上的位置(实际上称为构建上下文)。
  • 我尝试运行一个 dockerfile,它运行以下命令:RUN mkdir hello,但之后我在 windows 系统的任何地方都找不到文件夹 hello。所以这就是为什么我认为它直接进入码头。
  • 所以这个复制命令必须是:COPY D:\storage\application\src\index.js ?
  • 不,您应该在COPY 中使用相对路径,而且您已经在这样做了。 COPY . /app 会将 Windows 上当前目录 . 中的所有内容复制到 docker 映像内的 /app 中。
【解决方案2】:

index.js 文件在 src 目录下,所以 CMD 应该是 node 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 就不再依赖于文件树了。

【讨论】:

  • 我试图这样做,但后来我得到了一个意外的令牌,所以这很好,因为它来自我的代码,对吧?或者这是因为我没有指定它必须在某处做出反应?因为当我使用 npm start 它运行正常?所以它很奇怪它不会从我的 docker 文件中运行。也许我应该定义完整的应用程序并将其定义为 CMD["node", "."] ?
猜你喜欢
  • 2016-09-12
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2016-12-23
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多