首页 > 解决方案 > 为什么 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"]

标签: node.jslinuxdockerexpress

解决方案


推荐阅读