【问题标题】:Setting up docker nodejs application with local npm dependencies使用本地 npm 依赖项设置 docker nodejs 应用程序
【发布时间】:2017-11-23 01:35:04
【问题描述】:

我们想开始容器化我们的应用程序,但我们偶然发现了一些与本地依赖项有关的问题。

我们有一个单一的 git 存储库,其中我们有许多节点包,位于“共享”文件夹下,以及需要这些包的应用程序。

假设我们的文件夹结构如下:

src/
├── apps
│   └── my_app
└── shared
    └── shared_module

在 my_app package.json 我们有以下依赖:

{
  "dependencies": {
    "shared-module": "file:../../shared/shared_module"
  }
}

这里的问题是,因为我们想将“my_app”移动到容器中运行,我们需要 npm 安装我们的本地依赖项。

这个可以吗?

【问题讨论】:

    标签: node.js docker npm dockerfile


    【解决方案1】:

    是的,这是可能的,但有点难看。您的问题是 Docker 在其构建上下文方面非常严格。我不确定你对这个概念有多熟悉,所以这里是来自documentation的介绍:

    docker build 命令从 Dockerfile 和 context 构建映像。

    例如,docker build . 使用. 作为它的构建上下文,并且由于没有另外指定,./Dockerfile 作为 Dockerfile。 构建上下文之外的文件或路径不能在 Dockerfile 中被引用(所以没有COPY ..)。

    您的问题是,在 Docker 构建期间,构建上下文 不能保留。如果您要构建多个应用程序,通常会为每个应用程序添加一个Dockerfile

    src/
    ├── apps   
    │   ├── my_app
    │   │   └── Dockerfile
    │   └── my_other_app
    │       └── Dockerfile
    └── shared
        └── shared_module
    

    当然,您可以将cd 转换为my_app 并使用docker build . 来构建应用程序的Docker 映像。这个问题是你不能从构建中访问../../shared,因为它在上下文之外。

    所以您需要确保appsshared 都在构建上下文中。一种方法是将所有Dockerfile 放在src 中,如下所示:

    src/
    ├── Dockerfile.my_app
    ├── Dockerfile.my_other
    ├── apps
    │   ├── my_app
    │   └── my_other_app
    └── shared
        └── shared_module
    

    然后您可以通过显式指定上下文和 Dockerfile 来构建应用程序:

    src$ docker build -f Dockerfile.my_app .
    

    或者,您可以将 Dockerfile 保存在 my_appmy_other_app 中,并指向它们:

    src$ docker build -f apps/my_app/Dockerfile .
    

    这也应该有效。在这两种情况下,构建都是从src 中执行的,这意味着您需要稍微注意一下 Dockerfile 中的路径。 工作目录仍然是src:

    COPY ./apps/my_app /src/apps/my_app
    

    通过镜像您在本地的文件夹结构,您应该能够在不进行任何更改的情况下使您的依赖项工作:

    RUN mkdir -p /src
    COPY ./shared /src/shared
    COPY ./apps/my_app /src/apps/my_app
    RUN cd /src/apps/my_app && npm install
    

    希望能帮助您入门。

    【讨论】:

    • 非常感谢!我们将在这里尝试并发表评论。
    • 有人设法使用本地 NPM 构建 docker,例如:“shared-module”:“file:../../shared/shared_module”?我得到 cb() 从未被调用
    • 同样的问题。我认为实现这一点的方法是共享卷.. 但我仍然做不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多