2

我正在使用 Secrets 来管理用户名、密码和 dbname,并使用 Docker 堆栈将 Postgres 作为数据库。我现在想使用 Docker 提供的健康检查功能。

码头工人-compose.yml

x-db-secrets: &db_secrets
    - psql_user
    - psql_pass
    - psql_dbname

services:
  db:
    image: postgres:13.1
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER_FILE=/run/secrets/psql_user
      - POSTGRES_DB_FILE=/run/secrets/psql_dbname
      - POSTGRES_PASSWORD_FILE=/run/secrets/psql_pass
    secrets: *db_secrets
    healthcheck:
      test: pg_isready -U myuser -d db_prod
      interval: 10s
      timeout: 3s
      retries: 3

(... other services...)

volumes:
  postgres_data:
  static_content:
  media_content:

secrets:
  psql_user:
    external: true
  psql_pass:
    external: true
  psql_dbname:
    external: true

正如本healthcheck:节中所指出的,我将使用运行状况检查公开数据库用户名和数据库名称。我的问题(根据答案进行一些跟进):

  • 有关系吗?docker-compose.yml 文件不在运行此代码的主机上。因此,潜在的攻击者将无法从那里访问此信息......但是,由于 docker 将执行运行状况检查,它可能会在该容器中实时跟踪(shell?docker configs 存储该过程的文件?)
  • 如果它确实重要,我如何在不暴露该信息的情况下执行健康检查?我必须直接使用这些秘密,但是我不知道如何使用docker-compose文件中的秘密......

想法?解决方法?

额外细节:

  • 我目前正在检查数据库是否从使用它的(烧瓶)容器中启动。例如,烧瓶服务检查它是否可以 ping 数据库。但是,我宁愿将事物分开,而 DB 容器应该是一个告诉它是否健康的容器(imo)。
4

1 回答 1

0

由于 docker 套接字在主机上,因此 healthcheck 命令是通过 可见的docker inspect,因此只有在可以从用户名和/或 dbname 中检索到密码时才(真的)很重要。

可以说它总是很重要,但这取决于您的需求。

于 2021-12-22T10:53:10.300 回答