当前位置: 首页 > 知识库问答 >
问题:

Docker compose缺少对构建的纱线依赖

郭子航
2023-03-14

在Dockerfile中运行yarn install时无法获取node\u 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"
  }
}

Dockferfile文件

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纱线安装的输出:

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文件夹,但稍后在容器内运行时:纱线安装输出:

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个答案

殷学
2023-03-14

Dockerfile的这一部分安装纱线包:

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

文件夹/myapp已创建,包。json被复制到其中,并安装了yarn包。构建成功,当然,node_modules文件夹在构建的图像中。

但在那之后,您开始构建图像:

volumes:
  - .:/myapp

这意味着docker所在文件夹的内容。yaml安装在容器内的文件夹中,因此它涵盖了容器的文件夹的内容。

您不需要将当前文件夹装载到容器的文件夹中即可实现所需的内容。只需从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

编辑:

但是我想要的是在构建映像时,不要在旋转容器时获取这些依赖项。否则,我有另一个装载de源代码的容器,并且在运行“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 html" target="_blank">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/

这意味着,一旦容器启动,纱线包将构建在image内的文件夹中,并复制到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
 类似资料:
  • 我试图用Brazel建立一个围棋应用程序。我正在处理的是一个现有的私有GitHub repo(位置:),我的目标是从main.Go文件中创建一个二进制文件,该文件依赖于其他一些Go文件来实现它的方法。这是我的build.bazel文件,位于名为e2e的文件夹中,所有这些go文件都在这里: 这就是导入在main.go文件中的外观: 这是因为在主文件中导入了。为了包含导入,如果我将其添加到deps:中

  • 问题内容: 我认为这没有什么区别,但我使用的是Python 2.7。 因此,我的问题的一般部分如下:我为每个项目使用一个单独的项目。我没有管理员访问权限,而且我也不想弄乱系统安装的软件包。自然,我想使用轮子来加快整个系统的软件包升级和安装。如何构建仅在特定范围内满足依赖关系的轮子? 具体来说,发行 失败于 因为不存在全局和在构建轮,当工作与安装的是积极的,这似乎是一个可怕的想法有车轮依赖于特定的版

  • 我的STS版本:3.7.1.RELEASE,内部版本Id:201510041213,平台:Eclipse Mars。1(4.5.1)在选择例如Spring Starter project时没有创建正确的项目 当与我现有的一个项目进行比较时,我可以看到缺少了Builder。创建的项目仅包含Maven Builder 我的参考项目有Maven、Java和Spring project Builders。

  • 我有一个用Spring Boot的Gradle插件构建的可执行JAR。它在生成文件中具有以下依赖项: 建筑格拉德尔 问题是,在我运行之后,创建的工件不包含jar,只包含其他的tivemq jars: 因此,当我尝试运行jar时,我遇到了一个异常,即无法找到此依赖项中的类: 在构建过程中,依赖被下载,它可以在我的gradle缓存中找到,似乎出于某种原因,Spring Boot的Gradle插件在引导

  • 问题内容: 我正在尝试使用Maven构建Javahibernate项目。但是,当我尝试执行此操作时,似乎没有依赖项吗? 我的项目中现在有了这个pom.xml: 当我尝试使用mvn进行构建时,出现此错误: 我搜索了此错误,发现很多人必须在其pom.xml文件中更改其hibernate核心依赖版本,但似乎我没有hibernate核心,那么如何解决此问题? 问题答案: 它具有建议的JTA 1.1依赖性。

  • 我在创建带有依赖项的jar时遇到了一个错误。运行jar时,我遇到以下错误: 这是我的pom。xml文件 但是当我生成jar时,我得到错误无法找到或加载主类com.faro.engine.MainAppLoader这里是我的pom文件。 有什么想法吗? 提前感谢:)