gpt4 book ai didi

postgresql - 如何解决空 docker-entrypoint-initdb.d 的问题? (PostgresQL + docker )

转载 作者:行者123 更新时间:2023-11-29 12:49:34 37 4
gpt4 key购买 nike

这是我的项目结构的一部分:

enter image description here

这是我的 docker-compose.yml 文件的一部分: docker-compose.yml

这是我的 Dockerfile(位于 postgres-passport 文件夹内): dockerfile

我有 init.sql 脚本,它应该创建用户、数据库和表(用户和数据库与 docker-compose.yml 文件中的相同)

但是当我查看我的 docker-entrypoint-initdb.d 文件夹时,它是空的(没有 init.sql 文件)。我使用这个命令:

docker exec latest_postgres-passport_1 ls -l docker-entrypoint-initdb.d/

在我的服务器 (Ubuntu) 上,我看到: empty folder

我需要你的帮助,我做错了什么?(我如何使用 init.sql 脚本复制文件夹。Postgres 告诉我

/usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*

(因为他找不到这个文件夹)

以下所有代码为文本格式:

完整的 docker-compose.yml:

version: '3'

volumes:
redis_data: {}
proxy_certs: {}
nsq_data: {}
postgres_passport_data: {}
storage_data: {}

services:

# ####################################################################################################################
# Http services
# ####################################################################################################################
back-passport:
image: ${REGISTRY_BASE_URL}/backend:${TAG}
restart: always
expose:
- 9000
depends_on:
- postgres-passport
- redis
- nsq
environment:
ACCESS_LOG: ${ACCESS_LOG}
AFTER_CONFIRM_BASE_URL: ${AFTER_CONFIRM_BASE_URL}
CONFIRM_BASE_URL: ${CONFIRM_BASE_URL}
COOKIE_DOMAIN: ${COOKIE_DOMAIN}
COOKIE_SECURE: ${COOKIE_SECURE}
DEBUG: ${DEBUG}
POSTGRES_URL: ${POSTGRES_URL_PASSPORT}
NSQ_ADDR: ${NSQ_ADDR}
REDIS_URL: ${REDIS_URL}
SIGNING_KEY: ${SIGNING_KEY}
command: "passport"

# ####################################################################################################################
# Background services
# ####################################################################################################################
back-email:
image: ${REGISTRY_BASE_URL}/backend:${TAG}
restart: always
depends_on:
- nsqlookup
environment:
DEFAULT_FROM: ${EMAIL_DEFAULT_FROM}
NSQLOOKUP_ADDR: ${NSQLOOKUP_ADDR}
MAILGUN_DOMAIN: ${MAILGUN_DOMAIN}
MAILGUN_API_KEY: ${MAILGUN_API_KEY}
TEMPLATES_DIR: "/var/templates/email"
command: "email"

# ####################################################################################################################
# Frontend apps
# ####################################################################################################################
front-passport:
image: ${REGISTRY_BASE_URL}/frontend-passport:${TAG}
restart: always
expose:
- 80

# ####################################################################################################################
# Reverse proxy
# ####################################################################################################################
proxy:
image: ${REGISTRY_BASE_URL}/proxy:${TAG}
restart: always
ports:
- 80:80
- 443:443
volumes:
- "proxy_certs:/root/.caddy"
environment:
CLOUDFLARE_EMAIL: ${CLOUDFLARE_EMAIL}
CLOUDFLARE_API_KEY: ${CLOUDFLARE_API_KEY}
# ACME_AGREE: 'true'

# ####################################################################################################################
# Services (database, event bus etc)
# ####################################################################################################################
postgres-passport:
image: postgres:latest
restart: always
expose:
- 5432
volumes:
- "./postgres-passport:/docker-entrypoint-initdb.d"
- "./data/postgres_passport_data:/var/lib/postgresql/data"
environment:
POSTGRES_DB: ${POSTGRES_PASSPORT_DB}
POSTGRES_USER: ${POSTGRES_PASSPORT_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSPORT_PASSWORD}

redis:
image: redis
restart: always
expose:
- 6379
volumes:
- "redis_data:/data"

nsqlookup:
image: nsqio/nsq:v1.1.0
restart: always
expose:
- 4160
- 4161
command: /nsqlookupd

nsq:
image: nsqio/nsq:v1.1.0
restart: always
depends_on:
- nsqlookup
expose:
- 4150
- 4151
volumes:
- "nsq_data:/data"
command: /nsqd --lookupd-tcp-address=nsqlookup:4160 --data-path=/data

# ####################################################################################################################
# Ofelia cron job scheduler for docker
# ####################################################################################################################
scheduler:
image: mcuadros/ofelia
restart: always
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./etc/scheduler:/etc/ofelia"

docker 文件:

FROM postgres:latest

COPY init.sql /docker-entrypoint-initdb.d/

最佳答案

在您的 docker-compose.yml 文件中,您部分说:

postgres-passport:
image: postgres:latest
volumes:
- "./postgres-passport:/docker-entrypoint-initdb.d"
- "./data/postgres_passport_data:/var/lib/postgresql/data"

所以你正在运行库存 postgres 图像(你显示的 Dockerfile 永远不会被调用);以及本地 postgres-passport 目录中的任何内容,从与 docker-compose.yml 文件相同的目录开始,显示为 /docker-entrypoint-initdb .d 容器内的目录。

在你显示的目录树中,如果你

cd deploy/latest
docker-compose up

./postgres-passport 应该在 deploy/latest 树中。由于它实际上并不存在,因此 Docker 不会提示,只是将其创建为一个空目录。

如果您只是想注入(inject)这个配置文件,使用卷是一种合理的方法;你不需要 Dockerfile。但是,您需要提供您尝试装载到容器中的目录的正确路径。

postgres-passport:
image: postgres:latest
volumes:
# vvv Change this path vvv
- "../../postgres-passport/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d"
- "./data/postgres_passport_data:/var/lib/postgresql/data"

如果您想改用 Dockerfile,则需要告诉 Docker Compose 构建自定义镜像而不是使用标准镜像。由于您正在将 init 文件构建到镜像中,因此您不需要同一文件的绑定(bind)挂载。

postgres-passport:
build: ../../postgres-passport
volumes:
# Only this one
- "./data/postgres_passport_data:/var/lib/postgresql/data"

(您还需要调整 COPY 语句以匹配路径布局;只需将整个本地 docker-entrypoint-initdb.d 目录复制到图像中即 cocoa 能是最直接的事情。)

关于postgresql - 如何解决空 docker-entrypoint-initdb.d 的问题? (PostgresQL + docker ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57638831/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com