我正在使用Docker for Mac和Docker Compose开发Node.js应用程序,并且我在 package.json 文件被锁定时遇到错误。在正在运行的容器中运行npm install --save <package>
后的特定错误是:
npm WARN saveError EBUSY: resource busy or locked, rename
'/Example/package.json.1647356251' -> '/Example/package.json'
简化的包结构是:
▾ docker/
Dockerfile
docker-compose.yaml
package.json
Dockerfile 包含:
FROM node:9.5
ENV SOURCE_CODE /Example
COPY package.json $SOURCE_CODE/package.json
RUN npm --prefix $SOURCE_CODE install $SOURCE_CODE
WORKDIR $SOURCE_CODE
docker-compose.yaml 文件包含:
version: "3"
services:
node:
build:
context: ./
dockerfile: ./docker/Dockerfile
volumes:
- ./node_modules/:/Example/node_modules/
- ./package.json:/Example/package.json
package.json 文件包含:
{
"name": "example",
"version": "1.0.0",
"description": "example",
"license": "UNLICENSED"
}
运行docker-compose run --entrypoint bash node
以启动bash,然后在容器内运行npm install --save redux
会产生有关 package.json 文件被锁定的警告,但文件可以写入主机上的 node_modules 目录。如何使用此结构避免对 package.json 文件的锁定?
答案 0 :(得分:2)
我遇到了同样的问题,我通过挂载 package.json 所在的文件夹而不是 package.json 本身解决了这个问题。
version: "3"
services:
node:
build:
context: ./
dockerfile: ./docker/Dockerfile
volumes:
- .:/Example
直接挂载 package.json ,因为卷似乎会锁定文件。
答案 1 :(得分:0)
建议像“绿树”一样玩链接。想法:
在您的Dockerfile中,执行以下操作:
# Create a home dir, give access to 'node' user
ENV HOME [whatever your home is...]
RUN mkdir -p $HOME && \
chown node:node $HOME
# Switch to user node
USER node
# We'll place our files in npm-package
# Create that folder, place empty place holders in there,
# and create a link to them
RUN mkdir $HOME/npm-package && \
touch $HOME/npm-package/package.json && \
touch $HOME/npm-package/package-lock.json && \
ln -s $HOME/npm-package/package.json $HOME/package.json && \
ln -s $HOME/npm-package/package-lock.json $HOME/package-lock.json
存在临时文件有两个原因:
然后在docker-compose.yml中
services:
your-service-name:
volumes:
- npm-package/:/opt/app/npm-package/
为我工作(在Linux下)