我想在一个容器中运行由另一个容器安装的二进制 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。