node.js - 为什么 IncomingMessage 流不会在 Linux 上运行的 docker 容器中进行管道传输?
问题描述
我正在向运行在具有 linux 操作系统的 docker 容器内的节点服务发出请求。
当我在没有 docker 的 Windows 上本地运行以下代码时,它可以完美运行,但在 linux docker 容器中,它似乎对流什么都不做,然后最终中止。更下方的日志显示了代码中发生的情况。
我最初认为这可能是容器中的磁盘空间问题,但在阅读之后,似乎根本没有必要管理磁盘空间。
那么可能是什么问题?或者我该如何进一步调试这个问题?
编辑:我现在尝试了以下操作:1. 确认有 25GB 可用磁盘空间,2. 将文件名更改为操作系统的有效相对路径,3. 将文件名从 GUID 更改为更简单和更小的名称,例如“ dummy.tmp', 4. 还要确保我在管道流之前订阅了 'finish' 事件。
编码:
module.exports = function useTempFile(req, fileName, handlerAsync) {
const logDebug = (message) => logger.debug('useTempFile', message);
const logError = (message) => logger.error('useTempFile', message);
logDebug('invoked');
checkDiskSpace(path.join(process.cwd(), srcDirectoryName)).then(diskSpace => {
logDebug(`disk space: ${JSON.stringify(diskSpace)}`);
}).catch(error => {
logError(`disk space error: ${error}`);
});
let resolve = null;
let reject = null;
const promise = new Promise((innerResolve, innerReject) => {
resolve = innerResolve;
reject = innerReject;
});
const tempFileName = path.join(process.cwd(), srcDirectoryName, `${fileName || uuid.v4()}.tmp`);
try {
logDebug(`creating Write Stream, cwd: ${process.cwd()}, temp file name: ${tempFileName}`);
const fileStream = fs.createWriteStream(tempFileName);
fileStream.on('file', () => logDebug('\'file\' event'));
fileStream.on('finish', async () => {
logDebug('\'finish\' event');
try {
/* first validate that we actually received a file stream that was not empty */
const stats = await util.promisify(fs.stat)(tempFileName);
if (stats.size === 0)
reject(new ValidationError('File or stream is empty. Invalid request.'));
else {
if (!(await fsExistsAsync(tempFileName)))
throw new ValidationError('Temp file is no longer available');
const tempFile = fs.createReadStream(tempFileName);
const result = await handlerAsync(tempFile);
resolve(result);
}
} catch (e) {
logError(`'finish' event error: ${e.stack || e}`);
reject(e);
throw e;
} finally {
await _deleteAsync(tempFileName);
}
});
fileStream.on('error', async (err) => {
logError(`'error' event: ${err.stack || err}`);
await _deleteAsync(tempFileName);
reject(err);
});
fileStream.on('close', () => logDebug('\'close\' event'));
logDebug(`piping to Write stream: writable: ${fileStream.writable}, writableEnded: ${fileStream.writableEnded}, writableFinished: ${fileStream.writableFinished}`);
if (req.stream) {
logDebug(`Received a full stream object, aborted: ${req.stream.aborted}, complete: ${req.stream.complete}, readable: ${req.stream.readable}`);
req.stream.pipe(fileStream);
req.stream.on('aborted', () => logDebug('incoming stream \'aborted\' event'));
req.stream.on('close', () => logDebug('incoming stream \'close\' event'));
} else {
logDebug('Didn\'t receive a full stream object');
req.pipe(fileStream);
}
logDebug('waiting for stream write and pipe operation');
} catch (e) {
logError((e.stack || e));
reject(e);
throw e;
}
return promise;
};
日志输出:
2019-09-11T11:54:13.421Z [DEBUG] deployService - authorized
2019-09-11T11:54:13.421Z [DEBUG] startPackageSession - invoked
2019-09-11T11:54:13.422Z [DEBUG] useTempFile - invoked
2019-09-11T11:54:13.430Z [DEBUG] useTempFile - creating Write Stream, cwd: /apps, temp file name: /apps/service/dummyservice.tmp
2019-09-11T11:54:13.430Z [DEBUG] useTempFile - Received a full stream object, aborted: false, complete: false, readable: true
2019-09-11T11:54:13.430Z [DEBUG] useTempFile - piping to Write stream: writable: true, writableEnded: undefined, writableFinished: undefined
2019-09-11T11:54:13.430Z [DEBUG] useTempFile - waiting for stream write and pipe operation
2019-09-11T11:54:13.432Z [DEBUG] useTempFile - disk space: {"diskPath":"/","free":24688365568,"size":107317563392}
2019-09-11T11:55:00.086Z [DEBUG] useTempFile - incoming stream 'aborted' event
2019-09-11T11:55:00.087Z [DEBUG] useTempFile - incoming stream 'close' event
码头工人文件:
FROM dockereelb.int.capinet:8443/nodeplatform/platform_node:1.0.2_signed
WORKDIR /apps/service
COPY . .
WORKDIR /apps
ENTRYPOINT ["/apps/runtime/node/bin/node", "--max-http-header-size=80000", "/apps/platform/main.js", "/apps/service"]
解决方案
推荐阅读
- google-smart-home - StatusReport google home trait 的积极场景使用
- google-tag-manager - gtm 上的函数调用是否可用于向 Clevertap 发送事件?
- python - 通过循环遍历函数名称列表并使它们成为变量,从模块中调用许多 python 函数
- javascript - 如何在反应导航中将函数/方法作为参数传递。导航
- python - 使用具有 500k 行数据的 pandas read_sql 时出现内存错误
- sql - 从汽车列表中提取年份。如何从带有文本和其他数字的字符串中获取四位数字
- javascript - 该元素不会接受 textContent 输入
- php - 我想使用 forEach 或 PHP 中的循环在一个数组中的多个对象中获取特定值
- css - Hexo 无法加载样式表
- python - 使用通用格式将浮点数转换为字符串时如何抑制科学记数法?