gpt4 book ai didi

bash - 在终端和bash脚本中运行docker exec有什么区别

转载 作者:行者123 更新时间:2023-12-02 21:11:26 24 4
gpt4 key购买 nike

假设我在脚本中运行以下命令:

#!/usr/bin/env bash

docker run --name mydb --rm -e POSTGRES_PASSWORD=kgalli -e POSTGRES_USER=kgalli -p "9999:5432" -v $PWD/db:/opt -d postgres

然后,当我运行以下命令来创建数据库时,它可以正常工作。
docker exec -e PGPASSWORD=kgalli mydb psql -U kgalli -d template1 -c "CREATE DATABASE kgalli_test WITH OWNER kgalli ENCODING 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';"

但是,当我将此行添加到上面的脚本中时,该脚本不仅会启动postgres服务器,还会创建失败的数据库。

我不太明白为什么会出现以下错误:
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我知道我可以指示docker postgres镜像在启动时创建数据库。但这实际上不是我想要实现的。我仅以此为例来理解问题。

最佳答案

当您在脚本中运行它时,它很可能只是发生得太快。 docker run …命令立即返回,然后在数据库服务器仍在启动时,docker exec …尝试使用PostgreSQL。在创建额外的数据库之前,您需要等待它准备就绪。

就是说,postgres image在其入口点脚本中具有运行自定义初始化脚本的功能。您可以将CREATE DATABASE …语句放入.sql文件或配置中,然后将其安装到容器中的/docker-entrypoint-initdb.d中。数据库服务器就绪后,postgres容器将自动运行它。

这个文档似乎已经消失了,但是you can see the implementation in docker-entrypoint.sh

关于bash - 在终端和bash脚本中运行docker exec有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54389233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com