我正在做一项活动,当图像需要访问此资源时,我需要将信息写入文件,如下所示。 这就是我的文件夹的组织方式。节点2请求访问节点1。
下面的代码负责应用一种互斥,防止同时访问文件。问题是,当授予访问权限时,尽管
console.log(logEntry)
显示了应该写入的结果,但没有任何内容写入文件。
const sharedFilePath = path.join(__dirname, 'data', 'shared-file.txt');
let isResourceLocked = false;
app.get('/request-access/:deviceId', (req, res) => {
const deviceId = req.params.deviceId;
if (!isResourceLocked) {
isResourceLocked = true;
// Registrar no arquivo compartilhado
const timestamp = new Date().toISOString();
const logEntry = `Device ${deviceId} accessed the resource at ${timestamp}\n`;
console.log(logEntry)
fs.appendFileSync(sharedFilePath, logEntry, (err) => {
if (err) return console.log(err);
console.log('Log entry added to shared file:', logEntry);
});
// Liberar o recurso após um período simulado (por exemplo, 5 segundos)
setTimeout(() => {
isResourceLocked = false;
}, 5000);
res.send(`Access granted to Device ${deviceId}`);
} else {
res.send(`Resource is currently locked. Device ${deviceId} must wait.`);
}
});
在此代码中,我需要访问权限才能写入文件
app.get('/', async (req, res) => {
const deviceId = 'Node1'; // Identificador único para cada nó
try {
const response = await axios.get(`${coordenadorUrl}/request-access/${deviceId}`);
console.log(coordenadorUrl)
res.send(response.data);
} catch (error) {
res.send('Error requesting access to the resource.');
}
});
每个节点的Dockerfile都是这样的
FROM node:14
WORKDIR /usr/app
COPY package*.json ./
RUN npm install
RUN mkdir -p data
COPY . .
CMD ["npm", "start"]
docker-compose.ymml
version: '3.8'
services:
app:
build:
context: ./node1
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- EXTERNAL_PORT=3000
volumes:
- ./node1/data:/usr/src/app/data
networks:
- my-network # Adiciona o serviço à rede personalizada
app2:
build:
context: ./node2
dockerfile: Dockerfile
ports:
- "3002:3002"
environment:
- EXTERNAL_PORT=3002
networks:
- my-network # Adiciona o serviço à rede personalizada
networks:
my-network: # Defina uma rede personalizada
driver: bridge
🗎
app.js
const fs = require('fs');
const path = '/usr/src/app/data/shared-log.txt';
const id = process.env.ID || 'Default';
const appendContent = () => {
const now = new Date();
const timestamp = now.toISOString();
const contentToAdd = `${timestamp}: Data from: ${id}\n`;
fs.appendFile(path, contentToAdd, err => {
if (err) {
console.error('An error occurred:', err);
return;
}
console.log('Line appended successfully');
});
};
setInterval(appendContent, 5000);
将其包装在 Docker 镜像中。🗎
Dockerfile
FROM node:14
WORKDIR /usr/app
COPY package*.json ./
RUN npm install
RUN mkdir -p data
COPY . .
CMD ["node", "app.js"]
有一个最小的package.json
。现在是一个 Docker Compose 配置,用于创建容器的两个实例。
🗎
docker-compose.yml
version: '3.8'
services:
first:
build:
context: .
dockerfile: Dockerfile
environment:
- ID=first
volumes:
- .:/usr/src/app/data
second:
build:
context: .
dockerfile: Dockerfile
environment:
- ID=second
volumes:
- .:/usr/src/app/data
请注意,两者都安装了相同的位置卷,并且脚本正在写入安装的位置。当您启动 Docker Compose 时,您会发现两个容器写入同一个日志文件(该文件位于主机的当前目录中)。