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.
相关产品推荐
相关产品推荐

