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 做到这一点时就不会了。
关于为什么会这样的任何想法?
这比我预想的要容易,而且致命的是与 Gitlab CI 无关,而是与文件权限有关。
\n\n我转到--chmod=Du+rwx,Dgo-rwx,u+rw,go-rw
了rsync
看起来非常安全的地方,因为只有用户可以做一些事情。我承认我可能是从互联网上的某个地方复制粘贴的。但随后这些文件会被挂载到 Docker 容器,并且在那里它们也具有这些权限:
-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 的问题
现在我通过了, --chmod=D755,F644
看起来像这样:
-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如果您之前已经运行过 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)
-> 确保该卷未被容器使用,如果是,则也删除该容器
归档时间: |
|
查看次数: |
8888 次 |
最近记录: |