我有一个应用程序。该应用程序在 Linux 上运行,但我计划将其迁移到 docker 容器。
我开发了一些可以使用嵌入式 PostgreSQL 而不是常规 Postgres 数据库的模块。它在我的主机上运行良好,但在 Docker 中,进程退出并显示代码1
。
在应用程序中,我想使用以下命令启动一个子进程:
cmd := exec.Command("embeded-postgres")
err := cmd.Run()
错误是:
exit status 1
stderr 或 stdin 中没有其他信息
我认为存在某种机制可以检查容器中是否只有一个进程在运行,但我找不到任何文档。有人能给我指出正确的方向吗?我想阅读并了解更多相关信息。有人能指出
答案1
如果你能发布你的 Dockerfile,这将非常有助于确定原因,我很乐意帮助你进一步调试该问题。同时,这里有一些可能对您解决这个问题有帮助的事情。
- 你可以有
cmd.Run()
输出向 stderr 发送实际错误消息 - 要调用
exec.Command("embeded-postgres")
,名为的可执行文件embeded-postgres
需要位于 中的目录中$PATH
,请尝试使用安装可执行文件的完整路径(对于file
,这将是/usr/bin/file
)。您可以使用以下方法确定路径which embeded-postgres
- 确保
embeded-postgres
可执行文件存在于容器中。Docker 容器具有单独的文件系统,虽然它与主机共享某些内容(例如内核),但如果您已embeded-postgres
在主机上安装它,则容器将无法访问它。想想chroot
但要加强版。 - 虽然没有任何机制检查容器中是否只有一个进程在运行,但运行多个无关容器中的进程通常被认为是一种反模式。
- 我对你的用例没有太多信息,而且我绝对不知道
embeded-postgres
,但我发现这个 Go 库。这也许是一个更干净的解决方案,而不是安装系统可执行文件并用 调用它os/exec
?