在 docker compose 中指定用于健康检查的 postgres 参数的安全方法

Fra*_*y_V 28 docker docker-secrets health-check

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

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
Run Code Online (Sandbox Code Playgroud)

正如本节中可以指出的healthcheck:,我通过运行状况检查公开了数据库用户名和数据库名称。我的问题(根据答案进行一些后续行动):

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

想法?解决方法?

额外细节:

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

pri*_*ngi 41

您可以使用不带任何用户名/密码的pg_isready来检查容器是否“健康”。

  bbepostgres:
    image: postgres:14.2
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=pangea_local_dev
      - PGUSER=postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready", "-d", "db_prod"]
      interval: 30s
      timeout: 60s
      retries: 5
      start_period: 80s  
Run Code Online (Sandbox Code Playgroud)

这将完成与您想要的相同的事情。

参考: https: //github.com/peter-evans/docker-compose-healthcheck

  • 为什么“环境”变量中需要“PGUSER”?另外,为什么在“db_prod”而不是“pangea_local_dev”上执行“pg_ready”? (4认同)

Jos*_*ndo 35

.env因此,这可以通过使用文件并稍微修改您的文件来完成docker-compose.yml

POSTGRES_HOST=db
POSTGRES_USER=root
POSTGRES_PASSWORD=password
POSTGRES_DB=dev
Run Code Online (Sandbox Code Playgroud)
services:
  db:
    image: postgres:13.1
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - .env
    secrets: *db_secrets
    healthcheck:
      test: ["CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'"]
      interval: 10s
      timeout: 3s
      retries: 3
Run Code Online (Sandbox Code Playgroud)