我的docker主机上有一个管理器程序,它分配资源来处理传入的请求。我们想尝试将我们的一个c#进程放入docker容器(现在在本地运行)。
我找到了运行docker并调用我的c#程序的命令行:
/usr/bin/docker run -d -p 9001:9001 centos-foo /opt/mono/bin/mono /opt/prog/MyExe.exe --no-console --http_port 9001
当我使用System进程类构建该命令并调用start时,它不起作用。我的主机程序是在centos 6.5下的apache用户下单声道运行的c#。
Process mProcess = new Process();
mProcess.StartInfo.FileName = "/usr/bin/docker";
mProcess.StartInfo.Arguments = " run -d -p " + mPort + ":" + mPort + " centos-foo /opt/mono/bin/mono " + mParameters.Get(AppParameterKeys.PROVIDER_EXE) + " --no-console --http_port " + mPort;
mLog.Info("Starting ServiceProvider via command : " + mProcess.StartInfo.FileName + " " + mProcess.StartInfo.Arguments);
mProcess.StartInfo.UseShellExecute = false;
mProcess.StartInfo.CreateNoWindow = true;
mProcess.StartInfo.UserName = "root";
mProcess.StartInfo.Password = mSecurePasswd;
mProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(mParameters.Get(AppParameterKeys.PROVIDER_EXE));
mLog.Info("Starting ServiceProvider from directory : " + mProcess.StartInfo.WorkingDirectory);
mProcess.EnableRaisingEvents = true;
mProcess.Exited += OnProcessExited;
if (mProcess.Start())
{
mLog.Info("Start returned true");
}
...
我意识到我可能在退出的回调中遇到问题,但现在它甚至没有创建docker容器。我可以在log4net
输出中看到完整的命令,如果我将它粘贴到命令行,它就能运行。
我将整个块包裹在try/catch
中,但它不会抛出而start()
返回true。它实际上并没有开始任何事情。
所以,我不确定我是否真的使用username/password startinfo
获得root权限来运行docker。我也不知道是因为我的原始程序是单声道运行的,如果它试图以单声道运行docker并且它失败了。我很惊讶start()
返回true而不是抛出异常。
我现在正在考虑调用docker的HTTP接口,但我宁愿使用这种机制启动它。我在这里错过了什么或做错了什么?