You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bitbucket Pipelines中PostgreSQL镜像无法初始化双数据库问题

问题:Bitbucket Pipelines中PostgreSQL初始化脚本未执行,提示忽略/docker-entrypoint-initdb.d/*

在Bitbucket Pipelines中使用Docker Hub官方PostgreSQL镜像初始化两个数据库,已按教程配置挂载初始化脚本,但脚本始终未运行,日志显示/usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*,目标数据库未创建。

当前配置

服务定义

definitions:
  services:
    docker:
      # 提升docker服务内存,避免sonar scanner失败
      # 3072是pipelines任务的最大值,超过会消耗2倍构建时长
      memory: 3072
    postgres:
      image: postgres
      environment:
        POSTGRES_MULTIPLE_DATABASES: emailservice,meta_db
        POSTGRES_USER: auth
        POSTGRES_PASSWORD: auth
      volumes:
        - ./db_init/db_init.sh:/docker-entrypoint-initdb.d/db_init.sh
      ports:
        - 5432:5432

步骤定义

steps:
  - step: &run-tests
      runs-on:
        - "ctix"
        - "self.hosted"
      name: Unit Tests
      image: python:3.8.1
      size: 2x
      caches:
        - docker
        - pip
        - sonar
      services:
        - docker
        - postgres
      script:
        - pip install -r requirements.txt -q
        - mkdir -p test-reports/
        - pytest --cov-report xml:coverage.xml --cov=./
      artifacts:
        - test-reports/**

解决办法

1. 强制容器每次启动都执行初始化

PostgreSQL镜像仅在首次启动且数据目录为空时才会运行初始化脚本。如果self-hosted runner上残留了之前的PostgreSQL数据,容器会跳过初始化。通过挂载临时文件系统到数据目录,强制每次启动都重新初始化:

postgres:
  image: postgres
  environment:
    POSTGRES_MULTIPLE_DATABASES: emailservice,meta_db
    POSTGRES_USER: auth
    POSTGRES_PASSWORD: auth
  volumes:
    - ./db_init/db_init.sh:/docker-entrypoint-initdb.d/db_init.sh
    - type: tmpfs
      target: /var/lib/postgresql/data  # 临时存储数据,每次启动自动清空
  ports:
    - 5432:5432

2. 给初始化脚本添加执行权限

挂载到容器内的脚本可能缺少可执行权限,导致entrypoint脚本忽略它。可以在步骤脚本中先给本地脚本加权限:

# 在pip install之前添加
chmod +x ./db_init/db_init.sh

或者修改postgres服务的启动命令,先赋予容器内脚本权限再启动:

postgres:
  image: postgres
  environment:
    POSTGRES_MULTIPLE_DATABASES: emailservice,meta_db
    POSTGRES_USER: auth
    POSTGRES_PASSWORD: auth
  volumes:
    - ./db_init/db_init.sh:/docker-entrypoint-initdb.d/db_init.sh
  ports:
    - 5432:5432
  command: ["sh", "-c", "chmod +x /docker-entrypoint-initdb.d/db_init.sh && docker-entrypoint.sh postgres"]

3. 确认脚本路径和文件存在性

在步骤脚本中添加检查命令,确保文件存在于self-hosted runner的工作目录:

# 在pip install之前添加
ls -la ./db_init/

4. 验证初始化脚本内容

确保脚本正确读取环境变量并执行数据库创建操作,示例脚本如下:

#!/bin/bash

set -e
set -u

function create_user_and_database() {
	local database=$1
	echo "Creating user and database '$database'"
	psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
	    CREATE USER $database;
	    CREATE DATABASE $database;
	    GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
	EOSQL
}

if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
	echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
	for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
		create_user_and_database $db
	done
	echo "Multiple databases created"
fi

内容的提问来源于stack exchange,提问作者Victor B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:18:30