我有以下Docker Compose專案(下面提供的檔案內容):
.
|-- .dockerignore
|-- Dockerfile
|-- docker-compose.yml
|-- messages
|-- 20221120-010625.txt
|-- 20221120-010630.txt
`-- 20221120-010641.txt
|-- package.json
`-- server.js
當您Docker Compose使用以下命令運行專案時:
$ docker-compose up -d
您可以轉到 url:http://localhost/?message=<message>并在服務器上記錄多條訊息。
這里有一個例子:

到目前為止一切順利,但是......
我的用例是:有時候我需要更新網站的源代碼。例如,假設我需要在上面的螢屏截圖中為頁面文本添加前綴:Created file ...with: ###like:
### 創建的檔案:“/var/www/html/messages/20221120-010641.txt”,內容為:“這是一個測驗”。
但是我不能弄亂現有的訊息,因為那是服務器應用程式的寶貴資料。
我嘗試使用以下命令:
$ docker-compose down --volumes
$ docker-compose up -d --force-recreate --build
我的問題是:相應地更新源代碼后,即使頁面文本得到正確更新,所有訊息都丟失了,這不好。
你能告訴我我怎樣才能做到這一點嗎?
我嘗試在其中定義一個命名卷docker-compose.yml:
services:
serverapp:
...
volumes:
- messages:/var/www/html/messages
volumes:
messages:
...期望如果我銷毀服務器應用程式,訊息仍然存在,但這不起作用,因為該命名卷歸用戶所有root,訊息由用戶創建:node沒有權限在該卷上創建檔案目錄,這會導致錯誤。
以下是涉及檔案的內容:
.dockerignore
/node_modules/
/messages/
/npm-debug.log
檔案
FROM node:16-alpine
RUN mkdir -p /var/www/html && chown -R node:node /var/www/html
WORKDIR /var/www/html
COPY --chown=node:node . .
USER node
RUN npm i
EXPOSE 8080
CMD [ "npm", "run", "start" ]
# ENTRYPOINT ["tail", "-f", "/dev/null"]
docker-compose.yml
version: '3'
services:
serverapp:
image: alpine:3.14
build:
dockerfile: Dockerfile
container_name: serverapp
restart: unless-stopped
ports:
- "80:80"
包.json
{
"name": "docker-compose-tester",
"version": "1.0.0",
"main": "server.js",
"scripts": {
"start": "cross-env NODE_ENV=debug nodemon --exec babel-node server.js"
},
"dependencies": {
"express": "^4.16.1",
"moment": "^2.29.4"
},
"devDependencies": {
"@babel/node": "^7.20.2",
"cross-env": "^7.0.3",
"nodemon": "^2.0.20"
}
}
服務器.js
const express = require('express');
const moment = require('moment');
const path = require('path');
const fs = require('fs');
const PORT = 80;
const app = express();
app.use('/messages/', express.static(path.join(__dirname, 'messages')));
app.get('/', (req, res) => {
const message = req.query.message;
if (!message) {
return res.send('<pre>Please use a query like: "/?message=Hello World"</pre>');
}
const dirPathMessages = path.join(__dirname, 'messages');
const date = moment(new Date()).format('YYYYMMDD-HHmmss');
const fileNameMessage = `${date}.txt`;
const filePathMessage = path.join(dirPathMessages, fileNameMessage);
fs.mkdirSync(dirPathMessages, { recursive: true });
fs.writeFileSync(filePathMessage, message);
const filesList = fs.readdirSync(dirPathMessages);
const filesListStr = filesList.reduce((output, fileNameMessage) => {
const filePathMessage = path.join(dirPathMessages, fileNameMessage);
const message = fs.readFileSync(filePathMessage);
return output `<div><a href="/messages/${fileNameMessage}">/messages/${fileNameMessage}</a> -> ${message}</div>` "\n";
}, '');
res.send(`<pre>${filesListStr}\nCreated file: "${filePathMessage}" with content: "${message}".</pre>`);
});
app.listen(PORT, () => {
console.log(`TCP Server is running on port: ${PORT}`);
});
uj5u.com熱心網友回復:
您使用命名卷的方法是正確的。要解決權限問題,messages請在切換到node用戶之前更改 Dockerfile 中檔案夾的所有者。
FROM node:16-alpine
RUN mkdir -p /var/www/html && chown -R node:node /var/www/html
WORKDIR /var/www/html
COPY --chown=node:node . .
RUN mkdir -p messages && chown node:node messages
USER node
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/536447.html
上一篇:Ktor中的服務器正常運行時間
