我有一些关于Docker的问题。我对此知之甚少,请耐心等待
我有一个python脚本,它做一些的事情,并写入PostgreSQL数据库。两者都在Docker上运行。Python使用python:3.8.8-buster
和PostgreSQLpostgres:13
。使用docker-compose up
,我能够实例化这两个服务,并且可以看到插入PostgreSQL表中的项。当我像往常一样docker-compose down
时,服务会按预期关闭。以下是我的问题:
- 当我自己运行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中构建它)。这是预期的吗?如果是,为什么 - 登录后,当我
SELECT * FROM DB_NAME;
时,它显示0条记录。因此,基本上它不会显示在前一次运行中写入数据库的记录。为什么?当数据库未启动时,我如何查看数据库的内容?当容器运行时(当我docker-compose up
时),我知道我可以从PG Admin中看到记录(BTW也是我docker-compose.yml
文件的一部分,我拥有它只是为了更容易地查看记录是否已写入DB) - 因此,在我的脚本运行并写入数据库后,它就停止了。有没有办法先用
docker-compose down
再用docker-compose up
重新启动?(在VSCode上)当我简单地运行脚本时,虽然docker-compose
仍然是up
,但它说它找不到数据库(docker-compose.yml文件中提到了这一点)。因此,我必须返回并将脚本中的数据库名称更改为指向localhost
-这将返回到问题#1
我是docker的新手,我正在尽我所能地思考这一切。
-
此行为取决于您的特定设置。我必须查看
Dockerfile
和docker-compose.yaml
才能给出合适的答案。 -
这可能是由于将匿名卷而不是命名卷装载到
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'
- 我认为这更多地取决于脚本的内容,而不是配置docker
postgres
服务的方式。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
作为主机名以及已发布的端口。您不能在应用程序中对此配置进行硬编码。