Docker 在构建时组成缺失的纱线依赖项

2024-01-10

在Dockerfile中运行yarn install时无法获取node_modules文件夹

test-sof
├── docker-compose.yml
├── Dockerfile
├── package.json
└── yarn.lock

docker-compose.yml

version: '3'
services:
  web:
    build: .
    volumes:
      - .:/myapp

包.json

{
  "name": "site",
  "private": true,
  "dependencies": {
    "@rails/webpacker": "^3.2.1",
    "babel-preset-react": "^6.24.1",
    "prop-types": "^15.6.0",
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "reactjs": "^1.0.0",
    "underscore": "^1.8.3"
  },
  "devDependencies": {
    "webpack-dev-server": "^2.11.1"
  }
}

多克弗菲勒

FROM ruby:2.5

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && \
    apt-get install -qq -y build-essential libpq-dev nodejs yarn

RUN mkdir /myapp
WORKDIR /myapp

ADD ./package.json /myapp/

RUN yarn install

运行纱线安装步骤的输出docker-compose 构建:

Step 6/6 : RUN yarn install
---> Running in 3a0e7095ec81 
yarn install v1.3.2 
info No lockfile found. 
[1/4] Resolving packages... 
[2/4] Fetching packages... 
info [email protected] /cdn-cgi/l/email-protection: The platform "linux" is incompatible with this module. 
info "[email protected] /cdn-cgi/l/email-protection" is an optional dependency and failed compatibility check. Excluding it from installation. 
[3/4] Linking dependencies... 
warning "@rails/webpacker > [email protected] /cdn-cgi/l/email-protection" has unmet peer dependency "caniuse-lite@^1.0.30000697". 
warning " > [email protected] /cdn-cgi/l/email-protection" has unmet peer dependency "webpack@^2.2.0 || ^3.0.0". 
warning "webpack-dev-server > [email protected] /cdn-cgi/l/email-protection" has unmet peer dependency "webpack@^1.0.0 || ^2.0.0 || ^3.0.0". 
[4/4] Building fresh packages... 
success Saved lockfile. 
Done in 21.11s. 
Removing intermediate container 3a0e7095ec81  
---> 5720579a0f2a 
Successfully built 5720579a0f2a 
Successfully tagged testsof_web:latest

运行命令:docker-compose 运行 web bash进入容器

root@11af1818e494:/myapp# ls    
Dockerfile  docker-compose.yml  package.json

不存在 node_modules 文件夹,但稍后在容器内运行时:纱线安装 output:

root@11af1818e494:/myapp# yarn install
yarn install v1.3.2
info No lockfile found. 
[1/4] Resolving packages... 
[2/4] Fetching packages... 
info [email protected] /cdn-cgi/l/email-protection: The platform "linux" is incompatible with this module. 
info "[email protected] /cdn-cgi/l/email-protection" is an optional dependency and failed compatibility check. Excluding it from installation. 
[3/4] Linking dependencies... 
warning "@rails/webpacker > [email protected] /cdn-cgi/l/email-protection" has unmet peer dependency "caniuse-lite@^1.0.30000697". 
warning " > [email protected] /cdn-cgi/l/email-protection" has unmet peer dependency "webpack@^2.2.0 || ^3.0.0". 
warning "webpack-dev-server > [email protected] /cdn-cgi/l/email-protection" has unmet peer dependency "webpack@^1.0.0 || ^2.0.0 || ^3.0.0". 
[4/4] Building fresh packages... 
success Saved lockfile. 
Done in 13.03s.

然后列出时:

root@11af1818e494:/myapp# ls    
Dockerfile  docker-compose.yml  node_modules  package.json  yarn.lock

文件夹node_modules 存在。为什么?


这部分的Dockerfile安装纱线包:

RUN mkdir /myapp
WORKDIR /myapp
ADD ./package.json /myapp/
RUN yarn install

Folder /myapp被建造,package.json复制到其中并安装纱线包。构建成功了,当然,node_modules文件夹位于构建的图像内。

但之后你开始构建图像:

volumes:
  - .:/myapp

这意味着文件夹的内容docker-compose.yamlis 安装到/myapp容器内的文件夹,因此它覆盖了容器的内容/myapp folder.

您不需要将当前文件夹安装到容器的文件夹即可实现您想要的。只需将其从您的docker-compose.yaml:

version: '3'
services:
  web:
    build: .

现在你可以:

$ docker-compose build
$ docker-compose run web bash
root@558d5b0c2ccb:/myapp# ls -la
total 268
drwxr-xr-x   3 root root   4096 Feb 23 22:25 .
drwxr-xr-x  65 root root   4096 Feb 23 22:36 ..
drwxr-xr-x 818 root root  36864 Feb 23 22:25 node_modules
-rw-rw-r--   1 root root    333 Feb 23 22:07 package.json
-rw-r--r--   1 root root 219075 Feb 23 22:25 yarn.lock

EDIT:

但我想要的是在构建图像时,不要获取这些依赖项 当旋转容器时。否则我还有另一个容器 它安装了源代码并且需要这个node_modules文件夹 运行“docker-compose up”,我想避免某种 丑陋的睡眠直到node_modules完成。所以我需要呈现这个 在以某种方式启动容器之前我的根主机上的文件夹

如果您想实现上述目标,可以使用以下解决方法:

1.你修改Dockerfile一点:

FROM ruby:2.5

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && \
    apt-get install -qq -y build-essential libpq-dev nodejs yarn

RUN mkdir /build && mkdir /myapp
WORKDIR /build

ADD ./package.json /build/

RUN yarn install

WORKDIR /myapp

CMD cp -a /build/node_modules/ /myapp/

这意味着纱线包将被内置/build文件夹内的图像并复制到/myapp容器启动后的文件夹。

2.你用的是原装的docker-compose.yaml file:

version: '3'
services:
  web:
    build: .
    volumes:
      - .:/myapp

你几时开始web容器:

docker-compose up web

folder node_modules被复制到安装的文件夹,即.主机上的文件夹。

3.现在你可以启动任何容器,它将包含node_modules里面的文件夹/myapp:

docker-compose run web bash

因此,您将能够通过以下方式实现您的目标:

$ docker-compose build && docker-compose up web
$ docker-compose run web bash
root@4b38e60adfa3:/myapp# ls -la
total 64
drwxrwxr-x   3 1000 1000  4096 Feb 24 10:59 .
drwxr-xr-x  66 root root  4096 Feb 24 11:13 ..
-rw-rw-r--   1 1000 1000   497 Feb 24 10:55 Dockerfile
-rw-rw-r--   1 1000 1000    73 Feb 24 09:02 docker-compose.yaml
drwxr-xr-x 818 root root 40960 Feb 24 10:57 node_modules
-rw-rw-r--   1 root root   333 Feb 23 22:07 package.json
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 在构建时组成缺失的纱线依赖项 的相关文章

随机推荐

  • SQLite 查询异常 Android Studio 语法错误代码 1

    所以我试图为我的 Android 应用程序构建一个搜索方法 但我一直遇到这个错误 android database sqlite SQLiteException near Prefect syntax error code 1 while
  • 解析YAML,返回行号

    我正在根据 YAML 数据制作一个文档生成器 它将指定每个项目是从 YAML 文件的哪一行生成的 做这个的最好方式是什么 所以如果 YAML 文件是这样的 key1 item 1 key2 item 2 key1 another item
  • 配置文件不包括签名证书

    我已将 Xcode 更新到 8 因为我无法运行我的项目 我尝试启用 禁用 自动管理签名 选项 但不断收到 2 个警报 您的应用程序 ID 无法注册到您的开发团队 配置文件 不包括签名证书 我的签名证书 我是我们开发人员门户上的团队代理 我可
  • 如何在 Angular 中将标签与其外部的表单字段关联起来?

    假设我正在 ngFor 循环中创建标签和表单字段 如下所示 应用程序组件 ts export class AppComponent items aaa bbbbbb ccccccccc 应用程序组件 html div class form
  • Xcode 看不到我的 iOS 设备,但 iTunes 可以

    我有一个奇怪的问题 我的 Mac 上安装了装有 iOS 5 0 1 9A405 的 iPad 和 iOS SDK 5 0 1 以及 Xcode 4 2 Build 4C199 Xcode 看不到我的设备 它像往常一样说 iOS设备 而不是
  • Kafka Streams.allMetadata() 方法返回空列表

    所以我正在尝试使用 Kafka 流进行交互式查询 我有 Zookeeper 和 Kafka 在本地运行 在 Windows 上 我使用 C temp 作为 Zookeeper 和 Kafka 的存储文件夹 我已经设置了这样的主题 kafka
  • 在 Flutter 中更新下拉数据出现错误

    我正在开发一个小部件 其中包含dropdownbutton在颤振中 该小部件创建dropdownmenuitems向用户传入的 url 发出请求后 我已经看到正在拨打的电话和有效的响应 但是当我使用setState要更新下拉列表的数据源 我
  • 你能从 lua 修改 C 结构体吗?

    我希望能够拥有这个 Lua 代码 function myfunc s print s value s value 7 end 它应该适用于以下 C 代码 struct MyStruct float value void func MyStr
  • Func 委托中的 out 参数修饰符 (C#)

    我是 C 的初学者 只是一个关于 Func delegate 的问题 public delegate TResult Func
  • angularjs:在 ui-bootstrap 模式中使用指令

    我不知道如何从使用 dialog 服务创建的模式中调用指令 该指令还应该能够看到模式上的按钮并覆盖它们的 ng click 操作 这是我的模态模板 div class modal header h1 Rechercher h1 div di
  • 如何为Apple Watch添加加载视图?

    我想在按下 WKInterfaceButton 后显示加载视图 苹果提供的视图 我需要这个 因为按下 WKInterface 按钮后 我将调用主 iPhone 应用程序来执行一些服务调用 这将需要一些时间才能返回响应 WKInterface
  • 从 Visual Studio 2012 签入 TFS 后,所有文件都标记为只读

    我有两个项目的解决方案 我刚刚标记了解决方案并签入了它 现在所有文件的左侧都有蓝色挂锁的小图像 这显然意味着它们被标记为只读 到目前为止 我一直只使用 Tortoise SVN 这是我第一次签入 TFS 那么为什么会发生这种情况 或者如果这
  • 防止TinyMCE删除span元素

    这是问题演示 你可以在这里尝试一下 http fiddle tinymce com SLcaab http fiddle tinymce com SLcaab 这是TinyMCE默认配置 减去所有插件 使用扩展有效元素 跨度 1 打开 Ht
  • 如何在 Linux 和 Solaris 上编译 C?

    我想制作一个可以在 Linux 和 Solaris 中编译的 Makefile 我知道如何单独执行此操作 但如何将两者结合起来并能够检测我正在使用哪种操作系统 我试图仅对一个简单的 C 文件执行此操作 但更改的是编译器的名称 GNU Aut
  • 在 C++ 中,编译器“内联”函数对象意味着什么?

    在维基百科中它表示此类对象与 for each 一起使用时具有性能优势 因为编译器可以 内联 它们 我对这在这种情况下的确切含义有点模糊 或者在我不好意思说的任何情况下 谢谢你的帮助 最后一个参数为for each模板是一个functor
  • iOS 12 在 QuickType 栏中建议电话号码

    Lyft 如何在 QuickType 栏中建议我的电话号码 以便我无需手动输入 我知道 Apple 在 iOS 12 中引入了自动填充用户名 密码 安全代码等功能 看起来此电话号码建议可能使用类似的功能 但我不知道如何让我的任何应用程序建议
  • http://schema.openid.net/contact/email 和 http://axschema.org/contact/email 之间的区别

    何时使用http schema openid net contact email http schema openid net contact email以及何时使用http axschema org contact email http
  • 捕获信号:使用成员函数作为信号处理程序

    我有一个对象在无限循环中执行一些工作 这main 实例化该对象并调用run 方法 由于我不想使用线程 因此我需要一个解决方案来使我的对象停止运行 下面你就可以看到我的想法了 struct Foo void run running 1 whi
  • 如何使用 C# 启动或停止远程计算机中的 IIS 和 Windows 服务

    这段代码出现异常 尽管我在远程计算机上拥有管理员权限 class Program static void Main string args var sc new System ServiceProcess ServiceController
  • Docker 在构建时组成缺失的纱线依赖项

    在Dockerfile中运行yarn install时无法获取node modules文件夹 test sof docker compose yml Dockerfile package json yarn lock docker comp