Gitlab-CI: 绑定挂载失败
Gitlab-CI: Bind mount failed
我正在尝试为我的 dockerized Symfony 项目配置 Gitlab CI。
在测试阶段,我尝试启动我的 docker-compose.yml,其中一项服务需要绑定挂载。我的跑步者 确实看到 文件夹,但我无法使用它。
我得到测试输出:
$ docker-compose -f docker-compose_deploy.yml up -d
Creating network "xxx_default" with the default driver
Creating xxx_php_1 ...
Creating xxx_db_1 ...
Creating xxx_php_1 ... done
Creating xxx_nginx_1 ...
Creating xxx_db_1 ... error
ERROR: for xxx_db_1 Cannot start service db: Bind mount failed: '/backups' does not exists
为了测试我在 before_script
部分中包含了命令 ls /
。但它确实显示 /backups
,因为我更改了跑步者的 config.toml:
[[runners]]
name = "main-runner"
url = "https://gitlab.com/"
token = "xyz"
executor = "docker"
[runners.docker]
tls_verify = false
image = "docker:latest"
privileged = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/volume1/docker/postgres-backup:/backups", "/cache"]
shm_size = 0
[runners.cache]
这是我 .gitlab-ci.yml
的重要部分:
before_script:
- ls /
- docker info
- apk add --update py-pip && pip install docker-compose
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
build:
stage: build
script:
- docker-compose -f docker-compose_deploy.yml build --pull
test1:
stage: test
script:
- docker-compose -f docker-compose_deploy.yml up -d
- docker exec registry.gitlab.com/xxx-group/xxx_php_1 bash docker/php-fpm/initialization.sh
- docker exec registry.gitlab.com/xxx-group/xxx_php_1 bin/console app:initialize
- docker exec registry.gitlab.com/xxx-group/xxx_php_1 ./vendor/bin/simple-phpunit
after_script:
- docker-compose -f docker-compose_deploy.yml down
docker-compose.yml是
volumes:
pgdata:
services:
db:
image: postgres:9-alpine
volumes:
- pgdata:/var/lib/postgresql/data
- /backups:/backups
虽然构建的镜像无法执行,但我可以inspect
它们:
实际数量并没有在此处列出!
"Volumes": {
"/var/lib/postgresql/data": {}
}
您 运行正在 docker-in-docker 使用共享套接字。这意味着你有一个 Gitlab CI 运行ner host (a.k.a HOST) 和一个作业 运行ning in a container based在 docker:latest
(a.k.a JOBCONTAINER)上。
您的假设是您可以挂载存在于您的 JOBCONTAINER 中的文件(当您在 before_script
中 ls
时看到的文件),而实际上您开始使用的实际容器是 docker-compose
将 运行 在 HOST 的上下文中,因为您在 JOBCONTAINER 中使用它的 Docker 守护进程。
重复 Stefan von Gastel 的正确答案:
当 运行 测试时(和 docker-compose 测试 up
),在我的设置中,docker 命令 运行 docker 主机,即执行 gitlab-runner.
的机器
所以为了留在我的配置中,一个简单的
$ ln -s /volume1/docker/postgres-backup/ /backups
解决了我的问题,因为现在路径可用。事实上,volumes
中的条目在我运行的config.toml
中是不必要的。
谢谢斯特凡!
我正在尝试为我的 dockerized Symfony 项目配置 Gitlab CI。
在测试阶段,我尝试启动我的 docker-compose.yml,其中一项服务需要绑定挂载。我的跑步者 确实看到 文件夹,但我无法使用它。 我得到测试输出:
$ docker-compose -f docker-compose_deploy.yml up -d
Creating network "xxx_default" with the default driver
Creating xxx_php_1 ...
Creating xxx_db_1 ...
Creating xxx_php_1 ... done
Creating xxx_nginx_1 ...
Creating xxx_db_1 ... error
ERROR: for xxx_db_1 Cannot start service db: Bind mount failed: '/backups' does not exists
为了测试我在 before_script
部分中包含了命令 ls /
。但它确实显示 /backups
,因为我更改了跑步者的 config.toml:
[[runners]]
name = "main-runner"
url = "https://gitlab.com/"
token = "xyz"
executor = "docker"
[runners.docker]
tls_verify = false
image = "docker:latest"
privileged = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/volume1/docker/postgres-backup:/backups", "/cache"]
shm_size = 0
[runners.cache]
这是我 .gitlab-ci.yml
的重要部分:
before_script:
- ls /
- docker info
- apk add --update py-pip && pip install docker-compose
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com
build:
stage: build
script:
- docker-compose -f docker-compose_deploy.yml build --pull
test1:
stage: test
script:
- docker-compose -f docker-compose_deploy.yml up -d
- docker exec registry.gitlab.com/xxx-group/xxx_php_1 bash docker/php-fpm/initialization.sh
- docker exec registry.gitlab.com/xxx-group/xxx_php_1 bin/console app:initialize
- docker exec registry.gitlab.com/xxx-group/xxx_php_1 ./vendor/bin/simple-phpunit
after_script:
- docker-compose -f docker-compose_deploy.yml down
docker-compose.yml是
volumes:
pgdata:
services:
db:
image: postgres:9-alpine
volumes:
- pgdata:/var/lib/postgresql/data
- /backups:/backups
虽然构建的镜像无法执行,但我可以inspect
它们:
实际数量并没有在此处列出!
"Volumes": {
"/var/lib/postgresql/data": {}
}
您 运行正在 docker-in-docker 使用共享套接字。这意味着你有一个 Gitlab CI 运行ner host (a.k.a HOST) 和一个作业 运行ning in a container based在 docker:latest
(a.k.a JOBCONTAINER)上。
您的假设是您可以挂载存在于您的 JOBCONTAINER 中的文件(当您在 before_script
中 ls
时看到的文件),而实际上您开始使用的实际容器是 docker-compose
将 运行 在 HOST 的上下文中,因为您在 JOBCONTAINER 中使用它的 Docker 守护进程。
重复 Stefan von Gastel 的正确答案:
当 运行 测试时(和 docker-compose 测试 up
),在我的设置中,docker 命令 运行 docker 主机,即执行 gitlab-runner.
所以为了留在我的配置中,一个简单的
$ ln -s /volume1/docker/postgres-backup/ /backups
解决了我的问题,因为现在路径可用。事实上,volumes
中的条目在我运行的config.toml
中是不必要的。
谢谢斯特凡!