当前位置: 首页 > 知识库问答 >
问题:

如何解决空docker入口点initdb.d的问题?(PostgresQL Docker)

哈雅珺
2023-03-14

以下是我的项目结构的一部分:

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

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

docker exec最新发布的\u postgres-passport\u 1 ls-l docker入口点initdb.d/

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

/usr/local/bin/docker-entrypoint.sh:忽略/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"

Dockerfile:

FROM postgres:latest

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

共有1个答案

鞠泰平
2023-03-14

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

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

因此,您正在运行stockpostgres图像(您显示的Dockerfile从未被调用);本地postgres passport目录中的任何内容,从与docker compose.yml文件相同的目录开始,将显示为容器内的/docker entrypoint initdb.d目录。

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

cd deploy/latest
docker-compose up

/postgres passport应位于deploy/latest树中。因为它实际上并不存在,Docker并不抱怨,只是将它创建为一个空目录。

如果您只是尝试注入此配置文件,那么使用卷是一种合理的方法;您不需要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 Comment构建自定义映像,而不是使用标准映像。由于您正在将初始化文件构建到映像中,因此您不需要相同文件的绑定挂载。

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

(您还需要调整COPY语句以匹配路径布局;将整个本地docker entrypoint initdb.d目录复制到映像中可能是最简单的事情。)

 类似资料:
  • 本文向大家介绍如何解决redisTemplate注入为空问题,包括了如何解决redisTemplate注入为空问题的使用技巧和注意事项,需要的朋友参考一下 springboot2.*集成redis时,redis工具类中的redisTemplate注入后总是为空。 问题代码还原:   1、工具类定义成静态工具类,@Resource注入redisTemplate   2、控制层直接调用工具类的静态方法

  • 我是Java开发新手,不熟悉各种导入(Maven、Git等),所以我简单地说: 这两个没有在代码中解决我正在检查,我不知道我应该采取什么样的行动,也不知道我应该导入什么来解决它,但它可能是一些流行的库。 是否有完整的指南指导开发人员如何在eclipse中导入包(例如,C#开发人员使用Nuget,尽管有大量手工制作的包),或者他们真的使用所有这些巨大的导入选择器?

  • 问题内容: 下面的程序引发NullPointerException。在Log cat中,它显示: 单击该按钮时,它不会进入Mousefragment类。我试图解决它,但是我不能-如何解决这个问题? 编辑 单击该按钮多少次,该异常随同invalid_ip Toast消息一起显示 问题答案: 如前所述,您的问题询问如何解决此问题。 您需要弄清楚在哪里抛出。为此,请查看堆栈跟踪以查看引起问题的行。然后,

  • 问题内容: 我在做一个 用。我有我的输出。有人可以帮我吗?谢谢。 sendMailServlet代码: 在GlassFish 2.1上的输出: 问题答案: 您需要实施一个自定义 现在在 另请查看JavaMail常见问题解答

  • 假设我有以下Dockerfile: 命令使得在容器启动时启动。我还希望能够在容器启动时使用命令启动。但是,根据文档,Dockerfile中必须只有一个