docker - 为什么Gitlab-CI有时会以root所有者创建项目目录(但是我指定了另一个用户),以及如何解决该问题?

标签 docker continuous-integration gitlab gitlab-ci gitlab-ci-runner

我为测试项目安装了Gitlab CI / CD。我将docker容器与postgresgo一起使用,有时我需要更改sql init脚本(在数据库中创建表),因此我使用以下命令:

  • docker-compose stop
  • docker system prune
  • docker system prune --volumes
  • sudo rm -rf pay
  • ,然后在我的PC上将更改推送到Gitlab,它运行管道

  • 但是有时在第5步之后,Gitlab-CI在permission denied error步骤(见下文)上向我抛出了deploy,因为它创建了具有根所有者的pay目录。

    这是我的项目结构:

    project structure

    这是我的.gitlab-ci.yml文件:
    stages:
      - tools
      - build
      - docker
      - deploy
    
    variables:
      GO_PACKAGE: gitlab.com/$CI_PROJECT_PATH
      REGISTRY_BASE_URL: registry.gitlab.com/$CI_PROJECT_PATH
    
    # ######################################################################################################################
    # Base
    # ######################################################################################################################
    
    # Base job for docker build and push in private gitlab registry.
    .docker:
      image: docker:latest
      services:
        - docker:dind
      stage: docker
      variables:
        IMAGE_SUBNAME: ''
        DOCKERFILE: Dockerfile
        BUILD_CONTEXT: .
        BUILD_ARGS: ''
    
      script:
        - adduser --disabled-password --gecos "" builder
        - su -l builder
        - su builder -c "whoami"
        - echo "$CI_JOB_TOKEN" | docker login -u gitlab-ci-token --password-stdin registry.gitlab.com
        - IMAGE_TAG=$CI_COMMIT_REF_SLUG
        - IMAGE=${REGISTRY_BASE_URL}/${IMAGE_SUBNAME}:${IMAGE_TAG}
        - docker build -f ${DOCKERFILE} ${BUILD_ARGS} -t ${IMAGE} ${BUILD_CONTEXT}
        - docker push ${IMAGE}
      tags:
        - docker
    
    
    # ######################################################################################################################
    # Stage 0. Tools
    #
    # ######################################################################################################################
    
    # Job for building base golang image.
    tools:golang:
      extends: .docker
      stage: tools
      variables:
        IMAGE_SUBNAME: 'golang'
        DOCKERFILE: ./docker/golang/Dockerfile
        BUILD_CONTEXT: ./docker/golang/
      only:
        refs:
          - dev
    #    changes:
    #      - docker/golang/**/*
    
    
    # ######################################################################################################################
    # Stage 1. Build
    #
    # ######################################################################################################################
    
    # Job for building golang backend in single image.
    build:backend:
      image: ${REGISTRY_BASE_URL}/golang
      stage: build
      # TODO: enable cache
    #  cache:
    #    paths:
    #      - ${CI_PROJECT_DIR}/backend/vendor
    
      before_script:
        - cd backend/
    
      script:
        # Install dependencies
        - go mod download
        - mkdir bin/
    
        # Build binaries
        - CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -a -ldflags "-linkmode external -extldflags '-static' -s -w" -o bin/backend ./cmd/main.go
    
        - cp -r /usr/share/zoneinfo .
        - cp -r /etc/ssl/certs/ca-certificates.crt .
        - cp -r /etc/passwd .
      artifacts:
        expire_in: 30min
        paths:
          - backend/bin/*
          - backend/zoneinfo/**/*
          - backend/ca-certificates.crt
          - backend/passwd
      only:
        refs:
          - dev
    #    changes:
    #      - backend/**/*
    #      - docker/golang/**/*
    
    
    # ######################################################################################################################
    # Stage 2. Docker
    #
    # ######################################################################################################################
    
    # Job for building backend (written on golang). Only change backend folder.
    docker:backend:
      extends: .docker
      variables:
        IMAGE_SUBNAME: 'backend'
        DOCKERFILE: ./backend/Dockerfile
        BUILD_CONTEXT: ./backend/
      only:
        refs:
          - dev
    #    changes:
    #      - docker/golang/**/*
    #      - backend/**/*
    
    
    # ######################################################################################################################
    # Stage 3. Deploy on Server
    #
    # ######################################################################################################################
    
    deploy:dev:
      stage: deploy
      variables:
        SERVER_HOST: 'here is my server ip'
        SERVER_USER: 'here is my server user (it is not root, but in root group)'
      before_script:
        ## Install ssh-agent if not already installed, it is required by Docker.
        - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    
        ## Run ssh-agent
        - eval $(ssh-agent -s)
    
        ## Add the SSH key stored in SSH_PRIVATE_KEY_DEV variable to the agent store
        - echo "$SSH_PRIVATE_KEY_DEV" | tr -d '\r' | ssh-add - > /dev/null
    
        ## Create the SSH directory and give it the right permissions
        - mkdir -p ~/.ssh
        - chmod 700 ~/.ssh
    
        ## Enable host key checking (to prevent man-in-the-middle attacks)
        - ssh-keyscan $SERVER_HOST >> ~/.ssh/known_hosts
        - chmod 644 ~/.ssh/known_hosts
    
        ## Git settings
        - git config --global user.email ""
        - git config --global user.name ""
    
        ## Install rsync if not already installed to upload files to server.
        - 'which rsync || ( apt-get update -y && apt-get install rsync -y )'
      script:
        - rsync -r deploy/dev/pay $SERVER_USER@$SERVER_HOST:/home/$SERVER_USER/dev/backend
        - ssh -tt $SERVER_USER@$SERVER_HOST 'cd dev/backend/pay && ./up.sh'
      only:
        refs:
          - dev
    

    我已经尝试关闭更改触发器并清除gitlab容器注册表,但这没有帮助。

    我还发现有趣的是,那时工具管道启动(这是第一个管道),我的服务器立即创建了具有根所有者和空子文件夹的pay文件夹。

    我究竟做错了什么?谢谢。

    最佳答案

    嘿,GitLab团队成员在这里:我正在调查您的帖子,以帮助解决您的问题。 Linked here is a doc on what to do when you encounter Permissions Problems with GitLab+Docker.

    您可能已经尝试了其中一些步骤,所以请告诉我!在等待您回音的过程中,我将继续研究。谢谢!

    关于docker - 为什么Gitlab-CI有时会以root所有者创建项目目录(但是我指定了另一个用户),以及如何解决该问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59212916/

    相关文章:

    shell - Dockerfile ARG 和 ENV 中 shell 表达式的默认值

    variables - 无法获取继承的 gitlab CI/CD 变量

    kubernetes - Google Kubernetes Engine 上的 Gitlab 服务器邮件配置

    git - 使用 Gitlab 持续集成设置 PHPUnit

    angular - ngt_prehh在ng2-admin中缺少脚本

    docker - 蓝铜矿容器不暴露 ssl

    docker - 如何删除 kubernetes pod 的标签

    docker - 如何知道我的程序是否在compose中完全在docker内部启动

    visual-studio-2010 - 如何为 SharePoint 2010 Visual Studio 解决方案设置持续部署?

    android - 适用于 Android 项目的 GitLab.com CI 共享运行器