从Bluemix运行时访问NFS的任何方法?

时间:2015-05-26 13:59:24

标签: ibm-cloud

我需要将应用程序推送到需要通过NFS访问远程文件系统的Bluemix。

我还没找到任何NFS服务。现有的Object Store服务使用Swift API,应用程序需要本机文件系统访问,而不是其他类型的API。

我试图执行" mkdir"和#34; mount"来自应用程序初始化的命令,但似乎对运行运行时的用户执行此类执行存在限制。我得到的返回码代表错误。

所以我没有想法。您有什么建议或想法可供探索吗? 我认为Dockers可能是一个选择(如果我可以挂载nfs文件系统,还没有探索过),但目前它还处于测试阶段,所以没有生产就绪。

谢谢!

1 个答案:

答案 0 :(得分:0)

不支持NFS,但Cloud Foundry现在支持FUSE,这是一种非常接近NFS的替代方案。

要利用FUSE,您需要使用cflinuxfs2堆栈。

cflinuxfs2是一个支持FUSE的新堆栈,见下文。 Cloud Foundry最近添加了FUSE支持,see here for more info

name         description   
lucid64      Ubuntu 10.04   
cflinuxfs2   Ubuntu 14.04.2 trusty 

当您推送应用时,您需要使用-s选项,例如下面的例子。

cf push myappname -s cflinuxfs2

<强>更新

海报在另一个问题上贴了solution来说明如何做到这一点。我把它贴在下面......

好的,最后我在团队同事的帮助下找到了问题的原因。问题在于私有ssh密钥的权限。它必须为600,默认情况下,在cf推送后为644。

所以这里是最终的代码(快速和肮脏),以防万一它对其他人有用......

1.-在应用程序中包含私钥和known_hosts文件。

2.-推动应用添加&#34; -s cflinuxfs2&#34;参数。

3.-在运行时执行启动一些代码,如下所示:

String s = null;
Process p = null;
BufferedReader br = null;
try 
{
    p = Runtime.getRuntime().exec("mkdir -p /home/vcap/misc");
    br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while((s = br.readLine()) != null)
        System.out.println("line: " + s);
    p.waitFor();
    System.out.println ("#### Executing command mkdir with exit: " + p.exitValue());
    p.destroy();
    br.close();

    p = Runtime.getRuntime().exec("chmod 600 /home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key");
    br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while((s = br.readLine()) != null)
        System.out.println("line: " + s);
    p.waitFor();
    System.out.println ("#### Executing command chmod with exit: " + p.exitValue());
    p.destroy();
    br.close();

    p = Runtime.getRuntime().exec("chmod 600 /home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts");
    br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while((s = br.readLine()) != null)
        System.out.println("line: " + s);
    p.waitFor();
    System.out.println ("#### Executing command chmod with exit: " + p.exitValue());
    p.destroy();
    br.close();

    p = Runtime.getRuntime().exec("sshfs ibmcloud@129.41.133.34:/home/ibmcloud /home/vcap/misc -o IdentityFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/cloud.key -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/home/vcap/app/wlp/usr/servers/defaultServer/apps/myapp.ear/known_hosts -o idmap=user -o compression=no -o sshfs_debug");
    br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while((s = br.readLine()) != null)
        System.out.println("line: " + s);
    p.waitFor();
    System.out.println ("#### Executing command sshfs with exit: " + p.exitValue());
    p.destroy();
    br.close();

    p = Runtime.getRuntime().exec("ls -l /home/vcap/misc");
    br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while((s = br.readLine()) != null)
        System.out.println("line: " + s);
    p.waitFor();
    System.out.println ("#### Executing command ls with exit: " + p.exitValue());
    p.destroy();
    br.close();
}
catch(IOException ex)
{
    ex.printStackTrace();
}
catch(InterruptedException ex)
{
    ex.printStackTrace();
}
finally
{
    try 
    {
        if(br != null)
            br.close();
    }
    catch(IOException ex) 
    {
        ex.printStackTrace();
    }
}

此代码段应创建一个文件夹,将远程文件系统挂载到该文件夹​​中,并列出远程文件系统的内容。