在 docker-compose 中的容器之间共享 node_modules 二进制文件

在 docker-compose 中的容器之间共享 node_modules 二进制文件

我想在一个容器中运行由另一个容器安装的二进制 npm 文件。

我知道使用共享卷是可能的。

我有以下配置:

docker-compose.yml

version: '3'
services:
  cypress:
    build:
      context: .
      dockerfile: Dockerfile-cypress
    volumes:
      - ./node_modules:/app/node_modules
  test:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - cypress
    environment:
      - ENV=development
    volumes:
      - ./node_modules:/app/node_modules

Dockerfile-cypress

FROM cypress/base:10

WORKDIR /app

COPY . /app

RUN npm install uuid
RUN $(npm bin)/uuid

Dockerfile

FROM node:10.13

COPY . /app

WORKDIR /app

RUN $(npm bin)/uuid

运行时docker-compose build会失败,因为:

Step 5/5 : RUN $(npm bin)/uuid
 ---> Running in 1d86293ea47c
/bin/sh: 1: /app/node_modules/.bin/uuid: not found
ERROR: Service 'test' failed to build: The command '/bin/sh -c $(npm bin)/uuid' returned a non-zero code: 127

我的配置出了什么问题,导致第二个容器中的卷不可用?

答案1

卷仅在运行时共享,而不是在构建时共享。

每一个跑步指令在构建时起作用,此时卷不可用。

你应该把这些说明放在命令入口点指令。在这种情况下,由于应用程序很简单,我们甚至不需要dockerfiles。

version: '3'
services:
  cypress:
    image: cypress/base:10
    volumes:
      - ./node_modules:/app/node_modules
    working_dir: /app
    command: /bin/sh -c 'npm install uuid && chown -R your_user_uid:your_group_uid /app && $$(npm bin)/uuid'

  test:
    image: node:10.13
    working_dir: /app
    environment:
      - ENV=development
    volumes:
      - ./node_modules:/app/node_modules
    command: /bin/sh -c '$$(npm bin)/uuid'

在这种情况下,最好在 cypres 执行完成后运行测试命令,因为如果同时运行它们,您将无法知道二进制文件是否已可用。

我建议您在 Bash 中创建一个这样的脚本:

docker_up.sh

docker-compose run cypress
docker-compose run test

然后:

./docker_up.sh

笔记:

chown -R your_user_uid:your_group_uid /app

上述代码很重要,因为您在使用共享卷时可能会遇到权限问题。运行:echo $(id -u):$(id -g)获取您的 uid。

相关内容