【问题标题】:Building and pushing docker image from Gitlab-CI to Amazon AWS ECR从 Gitlab-CI 构建 docker 映像并将其推送到 Amazon AWS ECR
【发布时间】:2017-08-13 09:36:05
【问题描述】:

我在自己的机器上托管了一个私人 Gitlab。我将代码存储在 Gitlab 中,并希望从 Dockerfile 构建 Docker 映像,然后将其推送到我的 Amazon ECR 注册表。不幸的是,这不起作用,因为它会引发错误:

Flag --email has been deprecated, will be removed in 1.13.
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
/dev/mapper/control: open failed: Operation not permitted
Failure to communicate with kernel device-mapper driver.
Check that device-mapper is available in the kernel.
Command failed
mount: permission denied
Could not mount /sys/kernel/security.
AppArmor detection and --privileged mode might break.
mkdir: cannot create directory '/sys/fs/cgroup/name=systemd': Read-only file system
mount: mount point /sys/fs/cgroup/name=systemd is not a directory
ln: failed to create symbolic link '/sys/fs/cgroup/systemd/name=systemd': Read-only file system

Timed out trying to connect to internal docker host.

gitlab-ci 代码如下:

stages:
  - build

build_airflow:
  stage: build
  only: [master, develop]
  image: gitlab/dind:latest
  services:
    - docker:dind
  script:
    - APP=airflow
    - sh ./scripts/login-ecs.sh my_fancy_project

login-ecs.sh 脚本只是执行eval $(/usr/local/bin/aws ecr get-login --region eu-central-1),它应该将映像登录到 ECR docker 注册表(来源:https://blog.madisonhub.org/gitlab-ci-build-how-to-login-to-ecr/)。

我找不到问题,所以希望你能帮助我。

提前谢谢你。

PS:如果我在本地从aws ecr get-login 执行命令,它工作正常。所以它应该与gitlab做一些事情。我是否必须更改一些允许私人注册表登录的配置?

【问题讨论】:

    标签: amazon-web-services gitlab-ci docker-registry


    【解决方案1】:

    背景:
    您基本上是在尝试在默认情况下在 gitlab-ci 中不可用的 docker 容器中运行 docker 服务器。您可以通过运行检查 docker 客户端和服务器的状态:

    docker version

    在你的 gitlab-ci 脚本中。这通常是一个好主意,只是为了确保客户端和服务器正常运行。

    运行后你会注意到 docker 服务器没有运行,这就是你得到这个错误的原因: Cannot connect to the Docker daemon. Is the docker daemon running on this host?

    解决方案:
    有几种方法可以解决此问题,请参阅此处的 Gitlab 文档:
    https://docs.gitlab.com/ce/ci/docker/using_docker_build.html

    我们解决它的方法是使用docker-in-docker executor,这涉及更新您的 Gitlab Runner 配置并使用特殊的 docker-in-docker (dind) Docker Image 运行您的构建。

    您需要更新运行器,使其在特权模式下运行。这是一个示例config.toml:

    [[runners]]
      url = "https://gitlab.com/ci"
      token = TOKEN
      executor = "docker"
      [runners.docker]
        tls_verify = false
        image = "docker:latest"
        privileged = true
        disable_cache = false
        volumes = ["/cache"]
      [runners.cache]
        Insecure = false
    

    然后使用docker:latest 图像和docker:dind 服务。这是一个示例gitlab-ci.yamlsn-p:

    image: docker:latest
    
    # When using dind, it's wise to use the overlayfs driver for
    # improved performance.
    variables:
      DOCKER_DRIVER: overlay
    
    services:
    - docker:dind
    
    before_script:
    - docker info
    
    build:
      stage: build
      script:
      - docker version
      - docker build -t my-docker-image .
      - docker run my-docker-image /script/to/run/tests
    

    另一种方法是设置一个单独的 docker 服务器,设置环境变量 DOCKER_TLS_VERIFY 和 DOCKER_HOST 以便您的 docker 客户端可以安全地连接到服务器。

    要启用 TLS,您需要遵循以下说明:
    https://docs.docker.com/engine/security/https/

    【讨论】:

    • 这似乎已损坏/不起作用。不知道为什么。
    【解决方案2】:

    我按照以下步骤操作:

    https://webcaptioner.com/blog/2017/12/deploy-from-gitlab-to-aws-fargate/

    它使用 docker-in-docker 和以下来获得登录 AWS ECR 的能力

    export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY 
    $(aws ecr get-login --no-include-email --region $AWS_REGION | tr -d '\r')
    

    但是在调用GetAuthorizationToken 操作错误时似乎出现了一个错误(InvalidSignatureException)。我认为这可能是 python2/python3 的事情?

    【讨论】:

      猜你喜欢
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2023-03-23
      • 2020-02-13
      相关资源
      最近更新 更多