在Docker中的Windows Server 2016或2019上未能运行initdb.sql。

4
我在Windows Server 2016和2019上安装了Docker EE。我正在启动一个PostgreSQL容器,并有一个initdb.sql脚本来初始化数据库。我使用的是Windows容器,并且已在Windows 10的Windows容器模式下测试了脚本,包括docker和docker-compose。但是,一旦我将其移到Windows Server 2016/2019上,数据库就会启动,但不会运行initdb.sql脚本。这是我的docker-compose文件。
version: "3"

networks:
  localnetwork:

services:

  postgres_db:
    image: stellirin/postgres-windows:12-1809
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    volumes:
      - .\admin\${ENV:-dev}\dbms\init:C:\docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    networks:
      - localnetwork

如何让Windows Server 2016/2019运行initdb.sql?我无法使用docker exec进入容器,因为它返回Access is denied.

请注意,在Windows 10中也会出现Access is denied的情况。但是我可以使用Docker Desktop的界面进入容器进行检查。 Docker EE没有Docker Desktop,因此无法完成此操作。


容器日志中是否有任何错误报告?您尝试了什么 exec 命令?我的意思是,您能否指出您正在尝试运行的 docker exec 命令?您尝试过 docker exec -it <container id> powershelldocker exec -it <container id> cmd 吗?也许错误可能与卷挂载有关,也许由于某种原因 initdb.sql 脚本未被复制到容器中。 - jccampanero
嗨 jccampanero,我尝试运行 docker exec -it <container id> powershell,但是镜像没有安装PowerShell,所以无效。然后我尝试了 docker exec it <container id> :C/,但无法访问(access denied)。我在WS2019和W10上都遇到了这个问题,不过,在W10上使用Docker Desktop,我仍然能够登录到容器CLI。我试图将initdb复制到:C/,并在容器初始化期间执行command: dir以打印出:c\上的文件,发现initdb已经存在。此外,dir还显示了C:\docker-entrypoint-initdb.d是WS2019上的一个文件夹。 - Rui Nian
没有日志,初始化日志与我在W10上获得的日志相同,减去了从initdb.sql生成表的日志。 - Rui Nian
嗨@RuiNian。抱歉回复晚了。非常感谢您的反馈。您尝试过 docker exec -it <container id> cmd 吗?重要的是要检查 initdb.sql 文件是否在 C:\docker-entrypoint-initdb.d 中。作为解决方法,为避免与挂载卷相关的一些可能的错误,您可以尝试创建一个非常基本的 Dockerfile 并复制 initdb.sql:`FROM stellirin/postgres-windows:12-1809WORKDIR /docker-entrypoint-initdb.dCOPY initdb.sql ./ `。然后在您的 docker compose 中使用此 dockerfile。请问您能否尝试一下?这可能会给您一些线索。 - jccampanero
关于这个问题。 - jccampanero
你能够测试建议的“COPY”方法吗? - jccampanero
1个回答

0
当postgres windows用户帐户的1a)数据目录没有访问权限或1b)您正在挂载一个docker卷到一个在Windows和docker主机之间共享的目录时,就会发生这种情况。Thomas here的用户。

1a. 要检查PG_DATA目录的权限,请运行以下命令

// check your dir access
cacls "c:\YourPath\pgdata\dir"

1b) 如果目录在Windows和Docker主机之间共享,则可能会出现问题

docker run -p 54332:5432 -v /tmp/volumes/postgres/log:/var/log/postgresql -v /tmp/volumes/postgres/lib:/var/lib/postgresql mypostgres

2. 还请检查是否有以前崩溃的文件

手动删除\postgres\directory\postmaster.pid中的postmaster.pid文件,然后重新启动即可。

3. 您必须使用发布命令-p选项从容器中导出/发布端口到主机:

docker run -it -v D:/postgres:/home/dump --name some_postgres -p 5432:5432 -e POSTGRES_PASSWORD=root -d postgres

4. 检查您的防火墙规则

enter image description here

用最简单的方式启动带有Postgres和一个不错的参考链接的Docker。
docker run --name postgres-db -e POSTGRES_PASSWORD=docker -p 5432:5432 -d postgres

或许更容易拉取一个新的镜像

Pull down the latest [Postgres image from the Docker Hub][4]
Set the environment variable for password to 'docker'
Create a database, let's call it 'world'
Use a sql dump file to create the table schema and populate it with data


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接