簡體   English   中英

使用 docker-compose 鎖定 Docker 容器中的 package.json 文件

[英]Locked package.json files in Docker container using docker-compose

我正在使用 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'

簡化后的 package 結構為:

▾ 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"
}

Running docker-compose run --entrypoint bash node to start bash, then running npm install --save redux inside the container yields the warning about the package.json file being locked, however files are able to be written in the node_modules directory on the host. 如何使用此結構避免鎖定package.json文件?

我遇到了同樣的問題,我通過掛載package.json所在的文件夾而不是package.json本身解決了這個問題。

version: "3"

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

直接將package.json掛載為卷似乎會鎖定文件。

這是一個相當奇怪的配置問題,但我最終破解了難題。 這個想法是:

  1. 卷掛載主機的package-lock.jsonpackage-lock-host.json

  2. 在容器中運行npm install生成新內容

  3. 用容器新生成的內容覆蓋宿主機的內容

docker-compose run \
  --rm \
  --name 'package_lock_json' \
  -v "$(pwd)/package-lock.json":'/package-lock-host.json' \
  --entrypoint /bin/sh \
  'YOUR_CONTAINER_NAME' \
  -c "npm install --package-lock-only && (cat /package-lock.json > /package-lock-host.json)"

就像綠樹建議的那樣,玩鏈接是有效的。 想法:

  1. 在 Dockerfile 中創建一個空文件夾
  2. 更改所有者
  3. 在該文件夾中創建空 package*.json 文件
  4. 創建指向這些文件的鏈接,您希望它們在圖像中的位置
  5. 在源中創建等效文件夾,將 package*.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 下)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM