CI/CD流水线中PostgreSQL配置SSL证书时的权限问题求助
解决GitHub Actions中PostgreSQL容器SSL证书权限问题
问题描述
本地环境通过Makefile生成自签名SSL证书,再启动Docker Compose定义的PostgreSQL服务一切正常,但在GitHub Actions流水线中运行时,出现以下权限错误:
waiting for server to start....FATAL: private key file "/ssl/server.key" must be owned by the database user or root
现有配置
Docker Compose文件
services: postgres: image: postgres:latest environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - "5432:5432" networks: - my-network restart: always volumes: - db:/var/lib/postgresql/data - ../../../bin/certs/postgres:/ssl command: [ "postgres", "-c", "ssl=on", "-c", "ssl_cert_file=/ssl/server.crt", "-c", "ssl_key_file=/ssl/server.key", ] healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 volumes: db: driver: local networks: my-network: driver: bridge name: my-network
Makefile证书生成目标
.PHONY: generate-ssl gen-ssl: ## Generates a self signed ssl certificates @mkdir -p $(OUTPUT_DIR); \ openssl req -x509 -newkey rsa:4096 -keyout $(OUTPUT_DIR)/server.key -out $(OUTPUT_DIR)/server.crt -sha256 -days 365 -nodes -subj "/CN=localhost"; \ chmod 600 $(OUTPUT_DIR)/server.key;
解决方案
问题根源是GitHub Actions中生成的证书文件所有者与PostgreSQL容器内postgres用户(UID/GID为991)不匹配,以下是三种可行修复方案:
方案1:在GitHub Actions流水线中调整证书所有权
在生成证书的步骤后,添加调整文件所有者的命令,直接将证书权限设置为容器内postgres用户对应的UID/GID:
make gen-ssl sudo chown 991:991 bin/certs/postgres/server.key bin/certs/postgres/server.crt
此方案直接在CI环境中修正文件权限,容器挂载后即可正常读取。
方案2:修改Docker Compose命令,启动前调整权限
通过sh命令先以root身份修改证书所有权,再切换到postgres用户启动服务(利用镜像自带的gosu工具):
services: postgres: # ... 其他配置保持不变 command: [ "sh", "-c", "chown postgres:postgres /ssl/server.key /ssl/server.crt && gosu postgres postgres -c ssl=on -c ssl_cert_file=/ssl/server.crt -c ssl_key_file=/ssl/server.key" ]
此方案无需修改CI流程,直接在容器启动时完成权限修正。
方案3:更新Makefile,生成证书时设置正确所有权
在Makefile的gen-ssl目标末尾添加chown命令,指定UID/GID为991(容器内postgres用户的标识):
.PHONY: generate-ssl gen-ssl: ## Generates a self signed ssl certificates @mkdir -p $(OUTPUT_DIR); \ openssl req -x509 -newkey rsa:4096 -keyout $(OUTPUT_DIR)/server.key -out $(OUTPUT_DIR)/server.crt -sha256 -days 365 -nodes -subj "/CN=localhost"; \ chmod 600 $(OUTPUT_DIR)/server.key; \ chown 991:991 $(OUTPUT_DIR)/server.key $(OUTPUT_DIR)/server.crt;
注意:本地执行此命令可能需要sudo权限,可在CI中执行make gen-ssl时添加sudo,或根据环境判断是否执行chown步骤。
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

