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

jj-*_*-aa 3 dockerfile docker-compose yarnpkg

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

test-sof
??? docker-compose.yml
??? Dockerfile
??? package.json
??? yarn.lock
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3'
services:
  web:
    build: .
    volumes:
      - .:/myapp
Run Code Online (Sandbox Code Playgroud)

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

root@11af1818e494:/myapp# ls    
Dockerfile  docker-compose.yml  package.json
Run Code Online (Sandbox Code Playgroud)

没有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.
Run Code Online (Sandbox Code Playgroud)

然后在上市时:

root@11af1818e494:/myapp# ls    
Dockerfile  docker-compose.yml  node_modules  package.json  yarn.lock
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*lay 5

这部分Dockerfile安装纱包:

RUN mkdir /myapp
WORKDIR /myapp
ADD ./package.json /myapp/
RUN yarn install
Run Code Online (Sandbox Code Playgroud)

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

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

volumes:
  - .:/myapp
Run Code Online (Sandbox Code Playgroud)

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

您无需将当前文件夹安装到容器的文件夹即可实现所需的功能。只需将其从您删除docker-compose.yaml

version: '3'
services:
  web:
    build: .
Run Code Online (Sandbox Code Playgroud)

现在你可以:

$ 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
Run Code Online (Sandbox Code Playgroud)

编辑:

但是我想要的是在构建映像时,而不是在旋转容器时获得这些依赖关系。否则,我将有另一个容器,该容器会挂载源代码,并且在运行“ 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/
Run Code Online (Sandbox Code Playgroud)

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

2.您使用原始docker-compose.yaml文件:

version: '3'
services:
  web:
    build: .
    volumes:
      - .:/myapp
Run Code Online (Sandbox Code Playgroud)

当您启动web容器时:

docker-compose up web
Run Code Online (Sandbox Code Playgroud)

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

3.现在您可以启动任何容器,它将包含node_modules/myapp以下文件夹中:

docker-compose run web bash
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)