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

Posted

技术标签:

【中文标题】使用 docker-compose 在 Docker 容器中锁定 package.json 文件【英文标题】:Locked package.json files in Docker container using docker-compose 【发布时间】:2018-08-04 05:54:00 【问题描述】:

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

【问题讨论】:

更高版本的node(16+)好像没有这个问题 【参考方案1】:

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

version: "3"

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

package.json 直接安装为卷似乎会锁定文件。

【讨论】:

这个方案的问题是当前目录下的所有文件都挂载到了容器中(如.git.env等)。我希望避免安装所有内容,而是只选择构建/运行容器所需的文件。 您可以将源代码移动到 /src 子文件夹:./src/package.json & ./src/node_modules 并挂载它使用 docker 撰写 - ./src:/Example .dockerignore 不会阻止文件被挂载 你也不能在 docker 文件中使用不同的名字 此外,您可以使用链接解决问题 - 安装目录应该绑定文件,然后在容器内需要的位置创建指向它们的链接。虽然它并不总是适用(而且我不是 docker 方面的专家)。【参考方案2】:

就像 Green Tree 建议的那样,玩链接很有效。想法:

    在 Dockerfile 中创建一个空文件夹 更改所有者 在该文件夹中创建空的 package*.json 文件 创建指向这些文件的链接,您希望它们在图像中的位置 在您的源代码中创建等效文件夹,放置包*.json 里面的文件 在 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 下)

【讨论】:

以上是关于使用 docker-compose 在 Docker 容器中锁定 package.json 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 docker-compose 重启单个容器

如何让 docker-compose 始终从新图像重新创建容器?

Docker wwwhj6666com Compose18669144445 docke

Docker三剑客之一:Docker-compose

centos7 安装docker-compose

基于ARM64的CPU架构下的docker-compose安装