使用docker-compose在Docker容器中锁定package.json文件

时间:2018-02-24 07:10:18

标签: node.js docker docker-compose dockerfile package.json

我正在使用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 文件的锁定?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我通过挂载 package.json 所在的文件夹而不是 package.json 本身解决了这个问题。

version: "3"

services:
  node:
    build:
      context: ./
      dockerfile: ./docker/Dockerfile
    volumes:
      - .:/Example

直接挂载 package.json ,因为卷似乎会锁定文件。

答案 1 :(得分:0)

建议像“绿树”一样玩链接。想法:

  1. 在Dockerfile中创建一个空文件夹
  2. 更改所有者
  3. 在该文件夹中创建空包* .json文件
  4. 创建指向这些文件的链接,将它们放在图像中的位置
  5. 在您的源代码中创建等效文件夹,将包* .json放置 其中的文件
  6. 在docker-compose中,链接两个目录

在您的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下)