为什么 postgres 容器在 Gitlab CI 中忽略 /docker-entrypoint-initdb.d/*

mcn*_*ium 6 postgresql gitlab docker gitlab-ci gitlab-ci-runner

Gitlab CI保持在忽略了SQL的文件/docker-entrypoint-initdb.d/*这个项目

这是docker-compose.yml

version: '3.6'

services:

  testdb:
    image: postgres:11
    container_name: lbsn-testdb
    restart: always
    ports:
      - "65432:5432"
    volumes:
      - ./testdb/init:/docker-entrypoint-initdb.d
Run Code Online (Sandbox Code Playgroud)

这是.gitlab-ci.yml

stages:
  - deploy

deploy:
  stage: deploy
  image: debian:stable-slim
  script:
    - bash ./deploy.sh
Run Code Online (Sandbox Code Playgroud)

部署脚本基本上使用 rsync 通过 SSH 将存储库的内容部署到服务器:

rsync -rav --chmod=Du+rwx,Dgo-rwx,u+rw,go-rw -e "ssh -l gitlab-ci" --exclude=".git" --delete ./ "gitlab-ci@$DEPLOY_SERVER:test/"
Run Code Online (Sandbox Code Playgroud)

然后 ssh 进入服务器以停止并重新启动容器:

ssh "gitlab-ci@$DEPLOY_SERVER" "cd test && docker-compose down && docker-compose up --build --detach"
Run Code Online (Sandbox Code Playgroud)

这一切都很顺利,但是当容器启动时,它应该运行/docker-entrypoint-initdb.d/*我们在这里看到的所有文件。

但是相反,在docker logs -f lbsn-testdb服务器上执行时,我可以看到它说明

/usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样。在本地运行此容器时,甚至当我通过 ssh 连接到该服务器、克隆存储库并手动启动容器时,一切顺利并解析 sql 文件。只是当 Gitlab CI 做到这一点时就不会了。

关于为什么会这样的任何想法?

mcn*_*ium 6

这比我预想的要容易,而且致命的是与 Gitlab CI 无关,而是与文件权限有关。

\n\n

我转到--chmod=Du+rwx,Dgo-rwx,u+rw,go-rwrsync看起来非常安全的地方,因为只有用户可以做一些事情。我承认我可能是从互联网上的某个地方复制粘贴的。但随后这些文件会被挂载到 Docker 容器,并且在那里它们也具有这些权限:

\n\n
-rw------- 1 1005 1004 314 May  8 15:48 100-create-database.sql\n
Run Code Online (Sandbox Code Playgroud)\n\n

在主机上,我的 gitlab-ci 用户拥有这些文件,它们显然也由容器中 ID 为 1005 的某个用户拥有,并且除了该用户之外,没有向其他用户授予任何权限。

\n\n

执行操作的用户虽然在容器内部postgres,但无法读取这些文件。它不会抱怨,而是忽略他们。这可能会产生关于\xe2\x80\xa6 的问题

\n\n

现在我通过了, --chmod=D755,F644看起来像这样:

\n\n
-rw-r--r--  1 1005 1004  314 May  8 15:48 100-create-database.sql\n
Run Code Online (Sandbox Code Playgroud)\n\n

泊坞窗日志说

\n\n
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/100-create-database.sql\n
Run Code Online (Sandbox Code Playgroud)\n\n

一开始就太容易想到了:-/

\n


Jub*_*ali 5

如果您之前已经运行过 postgres 服务,那么当您重新启动它时,初始化文件将被忽略,因此请尝试--build再次使用它来构建映像

docker-compose up --build -d
Run Code Online (Sandbox Code Playgroud)

在你再次运行之前:

检查现有卷

docker volume ls
Run Code Online (Sandbox Code Playgroud)

然后删除您正在使用的 pg 服务

docker volume rm {volume_name}
Run Code Online (Sandbox Code Playgroud)

-> 确保该卷未被容器使用,如果是,则也删除该容器