我有一個包含需要保留的資料的卷。首次創建卷并將其掛載到我的節點容器時,所有容器內容都會復制到卷中,并且一切都按預期運行。問題是,當我更改節點容器中的一些檔案時,我會洗掉舊的映像和容器,并從頭開始重建它們。運行更新的容器時,容器的檔案不會被復制到卷中。這意味著該卷仍然包含舊檔案,因此當該卷安裝在容器中時,不存在更新的功能,我必須從頭開始洗掉并重新創建該卷,因為該卷的資料我無法這樣做需要堅持。
這是我的 dockerfile
FROM mcr.microsoft.com/dotnet/sdk:5.0
COPY CommandLineTool App/CommandLineTool/
COPY NeedBackupNodeServer App/NeedBackupNodeServer/
WORKDIR /App/NeedBackupNodeServer
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \
&& apt update \
&& apt install -y nodejs
EXPOSE 5001
ENTRYPOINT ["node", "--trace-warnings", "index.js"]
這是我的命令和預期輸出
docker volume create nodeServer-and-commandLineTool-volume
docker build -t need-backup-image -f Dockerfile .
docker run -p 5001:5001 --name need-backup-container -v nodeServer-and-commandLineTool-volume:/App need-backup-image -a
跑步時
docker exec need-backup-container cat index.js
該檔案存在并包含最新更新,因為該卷剛剛創建。
現在當我更新一些檔案時,我需要重建鏡像和容器,所以我運行
docker rm need-backup-container
docker rmi need-backup-image
docker build -t need-backup-image -f Dockerfile .
docker run -p 5001:5001 --name need-backup-container -v nodeServer-and-commandLineTool-volume:/App need-backup-image -a
現在我想在跑步的時候
docker exec need-backup-container cat index.js
我會看到更新的檔案更改,但不,我只看到第一次安裝卷時首先創建的舊檔案。所以我的問題是,有沒有辦法在創建容器時實作覆寫卷的檔案?
uj5u.com熱心網友回復:
如果您的應用程式需要持久資料,則應將其存盤在與應用程式代碼不同的目錄中。這可以在專用/data目錄中,也可以在應用程式的子目錄中;重要的是,當您掛載一個卷來保存持久資料時,它不會隱藏您的應用程式代碼。
例如,在 Node 應用程式中,您可以./data為您的資料檔案參考 a :
import { open } from 'fs/promises';
import { join } from 'path';
const dataDir = process.env.DATA_DIR || 'data';
const fh = await open(join(dataDir, 'file.txt'), 'rw');
然后在您的 Dockerfile 中,您需要創建該目錄。如果您設定了非 root 用戶,則該目錄(而不是您的代碼)應歸該用戶所有。
FROM node:lts
# Create the non-root user
RUN adduser --system --no-create-home nonroot
# Install the Node application normally
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY index.js .
# Create the data directory
RUN mkdir data && chown nonroot data
# Specify how to run the container
USER nonroot
CMD ["node", "index.js"]
然后當你啟動容器時,只在資料目錄上掛載卷,而不是在整個/app樹上。
docker run \
-p 5001:5001 \
--name need-backup-container \
-v nodeServer-and-commandLineTool-volume:/app/data \
need-backup-image
# ^^^^^^^^^
請注意,此處顯示的 Dockerfile 還允許您使用主機目錄而不是 Docker 命名卷,并在運行容器時指定主機 uid。您無需對影像進行任何更改即可執行此操作。
docker run \
-p 5002:5001 \
--name same-image-with-bind-mount \
-u $(id -u) \
-v "$PWD/app-data:/app/data" \
need-backup-image
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372002.html
標籤:码头工人 文件 docker-volume 码头集装箱
