使用 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 始终从新图像重新创建容器?