我正在使用,但如果我不使用,builder.AddPostgres().WithImage(...)
图像就会退出-it
docker run
文档中提到使用此图像的方式如下:
docker run \
-it \
-v postgresml_data:/var/lib/postgresql \
-p 5433:5432 \
-p 8000:8000 \
ghcr.io/postgresml/postgresml:2.7.12 \
sudo -u postgresml psql -d postgresml
这就是我添加 postgres 但没有开始工作的方式,该项目在仪表板中显示为已退出,在 docker 中,如果我按下播放按钮,它就会在不到 1 分钟的时间内启动并退出,这是保持容器运行的正确方法。
postgres = builder.AddPostgres("lcommerce-dependecy-postgres", port: 5432)
.WithImage("postgresml/postgresml")
.WithImageTag("2.9.3")
.WithImageRegistry("ghcr.io")
.WithHttpEndpoint(name: "endpoint-55432-5432",
port: 8000, targetPort: 8000, isProxied: true)
.WithContainerRuntimeArgs("-it", "--gpus=all");
我试图让容器保持运行.WithContainerRuntimeArgs("-it", "--gpus=all")
但一直退出。(默认情况下,net aspire 会添加 postgres 用户和密码,我已经测试了另一个图像pgvector/pgvector
并且它运行良好,但这个默认情况下不会退出)
更新
您可以使用
.WithContainerRuntimeArgs("-i", "--gpus=all")
.WithArgs("sudo", "-u", "postgresml", "psql", "-d", "postgresml")
但最好的是
(正如答案所暗示的):
.WithContainerRuntimeArgs("--gpus=all")
.WithArgs( "sleep","infinity")
正确的是
使用扩展和所需模块创建自定义图像,并将数据库服务器设置为主要持久进程,而不是使用解决方法(如答案所述)
该镜像的Dockerfile是公开的。它有几个重大的设计问题。最值得注意的是,它不将数据库服务器作为主容器进程运行,而是依赖于运行其他进程来“保持容器处于活动状态”,而实际上你永远不需要这样做。一个典型的解决方法是运行一个毫无意义的
sleep
命令。这可能看起来像内部发生了什么?图片表明
(通常你应该只运行
script
,而不是bash script
)而不使用默认的CMD
。entrypoint.sh
调用service postgresql start
(service
在 Docker 中通常不起作用,容器通常只运行一个进程),运行几个sudo -u postgresml
命令(sudo
很难使用,在 Docker 中几乎总是不必要的),最后以Docker 将
CMD
作为参数传递给ENTRYPOINT
,但在默认设置中CMD
为空。它运行时exec
没有参数,不执行任何操作,并且脚本退出。由于脚本是主容器进程,因此当脚本退出时,容器也会退出。Docker Hub
postgres
镜像页面指出PostGIS 镜像是构建 PostgreSQL 镜像和扩展的更典型方式。下载适当的扩展(PostgresML Dockerfile 使用 APT 来获取它,应该没问题),将相关的 SQLCREATE EXTENSION
命令放入脚本中/docker-entrypoint-initdb.d
,然后让正常的首次初始化设置扩展。对于这个特定的扩展,您需要在 PostgreSQL 镜像上添加 CUDA,而不是相反,但标准数据库镜像设置有点复杂,最好重用它。