正在生成容器,但是在生成多个docker容器时发出的命令失败

时间:2015-08-22 09:46:01

标签: node.js mongodb google-chrome amazon-ec2 docker

我们有一个自定义Chrome扩展程序,可执行一系列与Web相关的任务。任务必须是独占的,因此我们继续在运行chrome的单个docker容器上运行每个任务的概念

我们目前有4个运行ubuntu的ec2实例(c4.2xlarge),然后在docker容器中运行chrome。

我们还有一个更小的ec2实例,它从mongodb读取任务并将它们分配给一个接一个地填充它们的服务器。因此,如果添加了任务,则会将其分配给其中一个实例,然后将其选中,创建容器执行任务然后销毁容器。这些任务中的每一项大约需要2至6分钟才能完成。我们正在使用dockerode在nodejs中动态创建和销毁容器。

我们执行了很多基准测试并得出结论,每个服务器最多可以运行55个任务,因此我们在给定时间为每个服务器设置了最多45个任务的阈值,以便更安全。

这是在所有4个实例上运行的代码的一部分

function start_polling_mongo() {

    Tasks.find({
        server_id: instance_id,
        task_status: 1
    }, function(err, all_tasks) {
        //update the tasks
        Tasks.update({
            _id: {
                "$in": all_tasks
            }
        }, {
            task_status: 2
        }, {
            multi: true
        }, function(err) {
            //perform the tasks
            all_tasks.forEach(function(task) {
                setTimeout(function() {
                    run_task_in_container(task.task_id);
                }, 1000);
            });
        });
    });

    setTimeout(start_polling_mongo, 5000);

}

function run_task_in_container(task_id) {

    console.log('Running Task id : ' + task_id);

    var commands = '';
    commands += 'Xvfb :99 & ';
    commands += 'export DISPLAY=:99 & ';
    commands += 'x11vnc -rfbport ' + task_id + ' -display :99 -bg -q & ';
    commands += 'google-chrome --no-first-run --load-extension=/home/chrome_extension http://www.example.com/search?q=perform_task-' + task_id;

    var exposed_ports = {};
    exposed_ports[task_id + '/tcp'] = {};

    var port_bindings = {};
    port_bindings[task_id + '/tcp'] = [{
        HostPort: task_id.toString()
    }]

    docker.createContainer({
        Image: 'docker-chrome-final',
        ExposedPorts: exposed_ports,
        Cmd: ['bash', '-c', commands],
        Labels: {
            "task_id": task_id.toString()
        }
    }, function(err, container) {
        if (err) {
            console.log('error1 :');
            console.log(err);
            return;
        }
        container.start({
            Privileged: true,
            PortBindings: port_bindings
        }, function(err, data) {
            if (err) {
                console.log('error2 :');
                console.log(err);
                return;
            }
        });
    });

}

问题在于,一批150到180个任务都有随机容器被创建和启动但是chrome没有在同一个上运行(通常每个服务器上有2-3个容器)。我确认通过成功VNC进入服务器以呈现空白屏幕(XVFB)。

非常感谢任何输入!

0 个答案:

没有答案