dockerode,如何使进程在容器中运行独立于节点进程?

尤里·斯坦涅夫(Yury Stanev)

我正在开发一个dockerode用于容器管理的小型应用程序我正在尝试使进程在docker容器中运行独立于node进程。

本质上,我要达到的目标是,如果节点进程在重新启动后崩溃,它可以重新附加到正在运行的容器中,然后继续运行,就好像什么都没发生一样。

即使容器本身独立于节点,我遇到的问题也不是容器内的进程,如果节点被杀死,则docker容器中的进程也会被杀死。有没有办法从节点进程中分离容器中的进程?

创建容器并将其重新连接的功能如下:

function createContainer() {
    docker.createContainer({
        Image: 'ubuntu',
        Tty: true,
        Cmd: ['/bin/bash']
    }, function (err, container) {
        if (err) return;

        container.start({}, function (err, data) {
            const stream = fs.createWriteStream('./containerID.json');
            stream.write(JSON.stringify({
                containerID: container.id
            }));

            shell.exec(`docker cp ./script.sh ${container.id}:/`) // copy the file to the container

            runExec(container);
        });
    });
}

exports.containerAttach = (container) => {
    container.attach({
        stream: true,
        stdout: true,
        stderr: true
    }, function (err, stream) {
        stream.pipe(process.stdout);
    })
}
尤里·斯坦涅夫(Yury Stanev)

该容器最初是使用空闲的BASH Shell创建的。

docker.createContainer({
        Image: 'ubuntu',
        Tty: true,
        Cmd: ['/bin/bash']
    },...)

运行附加功能后,它将附加到该空闲TTY。解决方案是切换到docker.run()然后附加到正在运行的进程。

docker.run('node', ['./home/run-in-container.sh'], false, {
        Hostconfig: {
            Binds: [`${__dirname}:/home`]
        }
    }, {}, (err, data, container) => {
        if (err) throw err;
        console.log(data.StatusCode)
        console.log(container)
    })
    .on('container', (container) => {
        setTimeout(() => {
            fs.writeFileSync(path.join(__dirname, 'container.json'), JSON.stringify({
                id: container.id
            }));
            process.exit(0);
        }, 5000)
    })
    .on('stream', (stream) => {
        stream.on('data', data => console.log('-- STREAM --\n', data.toString()));
    })
    .on('data', (data) => {
        console.log('data', data);
    });

Attach函数基本保持不变,但略作修改以匹配新的run函数。

container.attach({
        stream: true,
        stderr: true,
        stdout: true
    }, (err, stream) => {
        if (err) console.log(`The container has ${container.id} been removed:\n\n${err}`);
        console.log(`Reattached to container: ${container.id}`);

        stream.on('data', (data) => console.log('-- STREAM --\n', data.toString()));
        stream.on('end', () => {
            console.log('\n-- STREAM END --')
        });
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将VS Code附加到在Docker容器中运行的节点进程

监控Docker容器中的节点进程

如何调试在Docker容器中运行的多个进程?

如何记录在Docker容器中运行的所有进程?

如何检查进程是否在Docker容器中运行

Libcontainer-在容器中运行多个进程

如何从Java启动独立的并发运行的Python进程

PHP:如何启动独立进程?

Docker容器的主机无响应-如何使主机独立于容器?

进程在节点REPL上运行

在Docker容器中运行的进程的主机中的PID是什么?

如何在同一个 docker 容器或 dyno 中运行 2 个进程?

如何将VisualVM附加到在Docker容器中运行的简单Java进程

如何在另一个异步进程结束后启动一个进程(独立于Web请求)

如何在Nodejs中获取现有运行进程的节点报告?

如何在节点中生成子进程中运行和处理错误

如何知道服务器中运行的所有节点进程

Docker-在单个容器中运行两个进程

如何检查进程是否在Linux中运行

如何在Symfony中运行后台进程

如何让用户在 linux 中运行最多的进程?

在Windows中杀死正在运行的节点进程

OSX默认的Apache进程无法在php中运行节点命令

如何停止进程运行?

如何设置节点进程的时区?

将电子进程作为普通节点进程运行?

如何使用bash在docker容器中获得僵尸进程

为什么在docker容器中运行top仅显示容器中的进程?

如何从Java程序启动完全独立的进程?