Ошибка ERR_STREAM_WRITE_AFTER_END в Dockerode - PullRequest
0 голосов
/ 30 января 2020

Я запускаю некоторые Docker контейнеры с Dockerode из приложения Node.js. В некоторых случаях в триггерах появляется ошибка: Error [ERR_STREAM_WRITE_AFTER_END]: write after end (см. Журнал ниже). Что-то я делаю не так?

Вот Docker код запуска:

// Create custom resolver to test data source
const triggerTestDataSourceContainer = () => {
    return async (resolve, source, args, context, resolveInfo) => {
        // [...]

        // Instantiate Docker
        var Docker = require("dockerode");
        var docker = new Docker({ socketPath: "/var/run/docker.sock" });

        // Run Docker container
        docker.run(
            "mobydq-scripts",
            ["python", "run.py", authorization, "test_data_source", dataSourceId.toString()],
            [process.stdout, process.stderr],
            { name: "mobydq-test-data-source-" + dataSourceId, Tty: false, HostConfig: { AutoRemove: true, NetworkMode: "mobydq_network" } },
            function(err, data, container) {
                // Do nothing
            }
        );

        return result;
    };
};

Вот ошибка:

mobydq-graphql | events.js:180
mobydq-graphql |       throw er; // Unhandled 'error' event
mobydq-graphql |       ^
mobydq-graphql |
mobydq-graphql | Error [ERR_STREAM_WRITE_AFTER_END]: write after end
mobydq-graphql |     at writeAfterEnd (_stream_writable.js:250:14)
mobydq-graphql |     at Socket.Writable.write (_stream_writable.js:299:5)
mobydq-graphql |     at processData (/home/node/app/node_modules/docker-modem/lib/modem.js:354:18)
mobydq-graphql |     at IncomingMessage.processData (/home/node/app/node_modules/docker-modem/lib/modem.js:346:9)
mobydq-graphql |     at IncomingMessage.emit (events.js:203:13)
mobydq-graphql |     at addChunk (_stream_readable.js:295:12)
mobydq-graphql |     at readableAddChunk (_stream_readable.js:276:11)
mobydq-graphql |     at IncomingMessage.Readable.push (_stream_readable.js:210:10)
mobydq-graphql |     at HTTPParser.parserOnBody (_http_common.js:129:22)
mobydq-graphql |     at Socket.socketOnData (_http_client.js:449:22)
mobydq-graphql | Emitted 'error' event at:
mobydq-graphql |     at errorOrDestroy (internal/streams/destroy.js:107:12)
mobydq-graphql |     at writeAfterEnd (_stream_writable.js:252:3)
mobydq-graphql |     at Socket.Writable.write (_stream_writable.js:299:5)
mobydq-graphql |     [... lines matching original stack trace ...]
mobydq-graphql |     at HTTPParser.parserOnBody (_http_common.js:129:22)

1 Ответ

0 голосов
/ 30 января 2020

Документация Dockerode о методе docker.run() не очень ясна, в частности, синтаксис для create_options и start_options в значительной степени не документирован. https://github.com/apocas/dockerode#equivalent -of- docker -run-in-dockerode

Полагаю, я что-то не так сделал с аргументами [process.stdout, process.stderr] и Tty: false. Кажется, следующие изменения устранили проблему.

const triggerTestDataSourceContainer = () => {
    return async (resolve, source, args, context, resolveInfo) => {
        // [...]

        // Instantiate Docker
        var Docker = require("dockerode");
        var docker = new Docker({ socketPath: "/var/run/docker.sock" });

        // Run Docker container
        docker.run(
            "mobydq-scripts",
            ["python", "run.py", authorization, "test_data_source", dataSourceId.toString()],
            process.stdout,
            { name: "mobydq-test-data-source-" + dataSourceId, HostConfig: { AutoRemove: true, NetworkMode: "mobydq_network" } }, // Start options
            function(err, data, container) {
                // Do nothing
            }
        );

        return result;
    };
};
...