首页 文章

Docker在构建时构成缺少的纱线依赖性

提问于
浏览
2

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

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

泊坞窗,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纱线安装:

步骤6/6:RUN纱线安装
--->在3a0e7095ec81中运行
纱线安装v1.3.2
info找不到锁定文件 .
[1/4]解决包裹......
[2/4]获取包裹......
info fsevents@1.1.3:平台“linux”与此模块不兼容 .
info“fsevents@1.1.3”是可选的依赖项和兼容性检查失败 . 从安装中排除它 .
[3/4]链接依赖关系......
警告“@ rails / webpacker> postcss-cssnext@3.1.0”具有未满足的对等依赖“caniuse-lite@^1.0.30000697” .
警告“> webpack-dev-server@2.11.1”具有未满足的对等依赖“webpack@^2.2.0 || ^ 3.0.0” .
警告“webpack-dev-server> webpack-dev-middleware@1.12.2”具有未满足的对等依赖“webpack@^1.0.0 || ^ 2.0.0 || ^ 3.0.0” .
[4/4]建造新包装......
成功保存锁文件 .
于21.11s完成 .
拆除中间容器3a0e7095ec81
---> 5720579a0f2a
成功建成5720579a0f2a
成功标记了testsof_web:latest

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

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

没有node_modules文件夹,但稍后在容器内运行时: yarn install output:

root @ 11af1818e494:/ myapp#yarn install
纱线安装v1.3.2
info找不到锁定文件 .
[1/4]解决包裹......
[2/4]获取包裹......
info fsevents@1.1.3:平台“linux”与此模块不兼容 .
info“fsevents@1.1.3”是可选的依赖项和兼容性检查失败 . 从安装中排除它 .
[3/4]链接依赖关系......
警告“@ rails / webpacker> postcss-cssnext@3.1.0”具有未满足的对等依赖“caniuse-lite@^1.0.30000697” .
警告“> webpack-dev-server@2.11.1”具有未满足的对等依赖“webpack@^2.2.0 || ^ 3.0.0” .
警告“webpack-dev-server> webpack-dev-middleware@1.12.2”具有未满足的对等依赖“webpack@^1.0.0 || ^ 2.0.0 || ^ 3.0.0” .
[4/4]建造新包装......
成功保存锁文件 .
于13.03完成 .

上市时:

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

文件夹node_modules它存在 . 为什么?

1 回答

  • 4

    这部分 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 文件夹的内容 .

    你不要't need to mount current folder to container'的文件夹来实现你想要的 . 只需从 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:

    但我想要的是在构建图像时,不要在旋转容器时获取这些依赖关系 . 否则我有另一个容器来安装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 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. 现在您可以启动任何容器,它将包含 /myapp 内的 node_modules 文件夹:

    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
    

相关问题