【问题标题】:Gitlab-CI: Bind mount failedGitlab-CI:绑定挂载失败
【发布时间】:2018-03-12 15:30:35
【问题描述】:

我正在尝试为我的 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 docker-compose gitlab-ci gitlab-ci-runner


    【解决方案1】:

    您正在使用共享套接字运行 docker-in-docker。这意味着您有一个 Gitlab CI 运行程序主机(又名 HOST)和一个基于 docker:latest(又名 JOBCONTAINER)的在容器中运行的作业。

    您的假设是您可以挂载存在于您的 JOBCONTAINER 中的文件(您在 before_script 中看到的那些文件),而实际上您以 docker-compose 开始的实际容器将运行在 HOST 的上下文中,因为您在 JOBCONTAINER 中使用它的 Docker 守护程序。

    【讨论】:

      【解决方案2】:

      重复 Stefan von Gastel 的正确答案:

      在运行测试(和 docker-compose'ing up)时,在我的设置中,docker 命令在 docker 主机的上下文中运行,即执行 gitlab-runner 的机器。

      所以要留在我的配置中,一个简单的

      $ ln -s  /volume1/docker/postgres-backup/ /backups
      

      解决了我的问题,因为现在路径可用。事实上,我的跑步者config.tomlvolumes 中的条目是不必要的。

      感谢斯特凡!

      【讨论】:

        猜你喜欢
        • 2020-09-09
        • 2019-11-07
        • 1970-01-01
        • 2019-04-07
        • 2018-06-05
        • 1970-01-01
        • 2022-11-18
        • 2018-07-24
        • 2020-06-14
        相关资源
        最近更新 更多