热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Docker在构建时丢失了纱线依赖

如何解决《Docker在构建时丢失了纱线依赖》经验,为你挑选了1个好方法。

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

test-sof
??? docker-compose.yml
??? Dockerfile
??? package.json
??? yarn.lock

docker-compose.yml

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

package.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"
  }
}

Dockfer文件

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 build时运行RUN yarn install的输出:

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 fsevents@1.1.3: The platform "linux" is incompatible with this module. 
info "fsevents@1.1.3" is an optional dependency and failed compatibility check. Excluding it from installation. 
[3/4] Linking dependencies... 
warning "@rails/webpacker > postcss-cssnext@3.1.0" has unmet peer dependency "caniuse-lite@^1.0.30000697". 
warning " > webpack-dev-server@2.11.1" has unmet peer dependency "webpack@^2.2.0 || ^3.0.0". 
warning "webpack-dev-server > webpack-dev-middleware@1.12.2" 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文件夹,但是稍后在容器内运行时:yarn install输出:

root@11af1818e494:/myapp# yarn install
yarn install v1.3.2
info No lockfile found. 
[1/4] Resolving packages... 
[2/4] Fetching packages... 
info fsevents@1.1.3: The platform "linux" is incompatible with this module. 
info "fsevents@1.1.3" is an optional dependency and failed compatibility check. Excluding it from installation. 
[3/4] Linking dependencies... 
warning "@rails/webpacker > postcss-cssnext@3.1.0" has unmet peer dependency "caniuse-lite@^1.0.30000697". 
warning " > webpack-dev-server@2.11.1" has unmet peer dependency "webpack@^2.2.0 || ^3.0.0". 
warning "webpack-dev-server > webpack-dev-middleware@1.12.2" 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它存在。为什么?



1> Nickolay..:

这部分Dockerfile安装纱包:

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

/myapp创建文件夹,package.json将其复制到该文件夹并安装纱包。构建成功,并且node_modules文件夹当然位于构建映像中。

但是之后,您将使用以下命令开始构建映像:

volumes:
  - .:/myapp

这意味着将文件夹的内容docker-compose.yaml安装到/myapp容器内部的文件夹中,因此它覆盖了容器/myapp文件夹的内容。

您无需将当前文件夹安装到容器的文件夹即可实现所需的功能。只需将其从您删除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

编辑:

但是我想要的是在构建映像时,而不是在旋转容器时获得这些依赖关系。否则,我将有另一个容器,该容器会挂载源代码,并且在运行“ docker-compose up”时需要此node_modules文件夹,并且我想避免某种丑陋的睡眠,直到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文件:

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

当您启动web容器时:

docker-compose up web

文件夹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


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 一、编译镜像1.编译镜像Dockerfile类似于Makfile,用户使用dockerbuild就可以编译镜像,使用该命令可以设置编译镜像时使用的CPU数量、内存大小、文件路径等语法: ... [详细]
  • Dockerfile中怎么将war包打入镜像
    今天就跟大家聊聊有关Dockerfile中怎么将war包打入镜像,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据 ... [详细]
  • postgresql创建数据库
    一.创建Dockerfile文件(~dockerDockerfile)#FROMpostgres:9.3-alpineFROMlibrarypostgresENVPOSTGRES_ ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
  • 【BP靶场portswigger服务端10】XML外部实体注入(XXE注入)9个实验(全)
    前言:介绍:博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。殊荣:CSDN网络安 ... [详细]
  • Objective C接入Sonar代码扫描
    目录技术方案环境准备扫描器配置项目配置SonarQube配置jenkins接入一些坑技术方案Sonar本身有对OC的代码扫描插件——SonarCFamily,但是是收费的。出于成本 ... [详细]
  • DockerfileDocker是软件工业上的集装箱技术。通过以下文件制作Docker镜像[root@Optimusdocker-training]#cdcentos7[root@ ... [详细]
author-avatar
手机用户2502855763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有