在 Docker Nodejs 映像中写入文件时出现问题

问题描述 投票:0回答:1

我正在做一项活动,当图像需要访问此资源时,我需要将信息写入文件,如下所示。 这就是我的文件夹的组织方式。节点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
    
node.js docker docker-compose distributed-computing
1个回答
0
投票
您需要与两个容器共享相同的卷。假设您有一个简单的添加记录到文件中:

🗎

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 时,您会发现两个容器写入同一个日志文件(该文件位于主机的当前目录中)。

© www.soinside.com 2019 - 2024. All rights reserved.