使用Python和PostgreSQL的Docker



我有一些关于Docker的问题。我对此知之甚少,请耐心等待

我有一个python脚本,它做一些的事情,并写入PostgreSQL数据库。两者都在Docker上运行。Python使用python:3.8.8-buster和PostgreSQLpostgres:13。使用docker-compose up,我能够实例化这两个服务,并且可以看到插入PostgreSQL表中的项。当我像往常一样docker-compose down时,服务会按预期关闭。以下是我的问题:

  1. 当我自己运行PostgreSQL服务的容器(不是使用docker-compose up,而是使用docker run,然后使用docker exec),然后使用PSQL登录数据库时,它不会将数据库名称作为docker-compose.yml文件中提到的数据库名称。它使用localhost,但使用docker-compose.yml文件中提到的用户名。它也没有问我密码,尽管它在Dockerfile本身中提到了(而不是docker-compose.yml-对于每个services,我都有一个Dockerfile,我在docker-compase.yml中构建它)。这是预期的吗?如果是,为什么
  2. 登录后,当我SELECT * FROM DB_NAME;时,它显示0条记录。因此,基本上它不会显示在前一次运行中写入数据库的记录。为什么?当数据库未启动时,我如何查看数据库的内容?当容器运行时(当我docker-compose up时),我知道我可以从PG Admin中看到记录(BTW也是我docker-compose.yml文件的一部分,我拥有它只是为了更容易地查看记录是否已写入DB)
  3. 因此,在我的脚本运行并写入数据库后,它就停止了。有没有办法先用docker-compose down再用docker-compose up重新启动?(在VSCode上)当我简单地运行脚本时,虽然docker-compose仍然是up,但它说它找不到数据库(docker-compose.yml文件中提到了这一点)。因此,我必须返回并将脚本中的数据库名称更改为指向localhost-这将返回到问题#1

我是docker的新手,我正在尽我所能地思考这一切。

  1. 此行为取决于您的特定设置。我必须查看Dockerfiledocker-compose.yaml才能给出合适的答案。

  2. 这可能是由于将匿名卷而不是命名卷装载到postgres服务所致。执行docker-compose up时不会自动装入匿名卷。命名卷为。

以下是如何装载名为database:的命名卷的docker-compose.yaml示例

version: '3.8'
# Defining the named volume
volumes:
database:
services:
database:
image: 'postgres:latest'
restart: 'always'
environment:
POSTGRES_USER: 'admin'
POSTGRES_PASSWORD: 'admin'
POSTGRES_DB: 'app'
volumes:
# Mounting the named volume
- 'database:/var/lib/postgresql/data/'
ports:
- '5432:5432'
  1. 我认为这更多地取决于脚本的内容,而不是配置dockerpostgres服务的方式。Postgres不会在简单地向其写入数据后关闭。但是,我必须再次查看Dockerfiles(s)和docker-compose.yaml(以及脚本),以便提供更合适的答案

如果docker run是一个映像,它总是创建一个新容器,并且从不查看docker-compose.yml。例如,如果您使用

docker run --name postgres postgres
docker exec -it postgres ...

它基于postgres:latest映像启动一个新容器,而没有特定的存储或网络设置。这就是为什么您不能使用容器的Compose主机名,也不能查看Compose设置通常会有的任何数据。

您可以使用docker-compose up来启动特定的服务及其依赖关系,不过:

docker-compose up -d postgres

完成此操作后,可以使用psql等普通工具通过其发布的ports:连接到数据库

psql -h localhost -p 5433 my_db

您不应该需要像docker exec这样的正常调试工具;如果你这样做了,有一个Compose变体知道Compose服务名称

# For debugging use only -- not the primary way to interact with the DB
docker-compose exec postgres psql my_db

在我的脚本运行并写入数据库后,它就停止了。有办法重新启动吗?

几个选项:

  • 让你的脚本不要停止,不管怎样。Docker容器通常会有类似HTTP服务的东西,可以接受请求并对其进行操作
  • 重新运行docker-compose up -d(不首先明确运行down)将重新启动任何已停止的内容或Compose配置已更改的内容
  • 您可以直接在主机上运行一次性脚本,配置指向数据库发布的ports:

这里相关的是;在Compose环境中;以及";直接在开发者系统上";是不同的环境,您需要像环境变量这样的机制来传达这些信息。在Compose环境中,您需要数据库容器的名称和默认的PostgreSQL端口5432;在开发人员系统上,您通常需要localhost作为主机名以及已发布的端口。您不能在应用程序中对此配置进行硬编码。

相关内容

  • 没有找到相关文章

最新更新