【问题标题】:How to fix ”unable to prepare context: unable to evaluate symlinks in Dockerfile path” error in circleci如何修复circleci中的“无法准备上下文:无法评估Dockerfile路径中的符号链接”错误
【发布时间】:2019-08-03 18:18:31
【问题描述】:

我正在设置 circle-ci 以自动构建/部署到 AWS ECR &ECS。
但是由于没有Dockerfile,构建失败。
也许这是因为我为多个 docker 图像设置了docker-compose
但我不知道如何解决这个问题。
有没有办法让DockerFile代替docker-compose

  • 正面:反应
  • 后端:Golang
  • ci-工具:circle-ci
  • 数据库:mysql
article
 ├ .circleci
 ├ client
 ├ api  
 └ docker-compose.yml

我设置了 .circleci/config.yml。

version: 2.1

orbs:
  aws-ecr: circleci/aws-ecr@6.0.0
  aws-ecs: circleci/aws-ecs@0.0.8

workflows:
  build_and_push_image:
    jobs:
      - aws-ecr/build-and-push-image:
          region: AWS_REGION
          account-url: AWS_ECR_ACCOUNT_URL
          repo: 'article-ecr-jpskgc'
          tag: '${CIRCLE_SHA1}'
      - aws-ecs/deploy-service-update:
          requires:
            - aws-ecr/build-and-push-image
          family: 'article-task-jpskgc'
          cluster-name: 'article-cluster-jpskgc'
          service-name: 'article-service-jpskgc'
          container-image-name-updates: 'container=article-container-jpskgc,tag=${CIRCLE_SHA1}'

这里是github中的源代码。 https://github.com/jpskgc/article

我希望通过 circle-ci 构建/部署到 ECR/ECS 成功,但实际上失败了。
这是circle-ci的错误日志。

Build docker image
Exit code: 1
#!/bin/bash -eo pipefail
docker build \
   \
  -f Dockerfile \
  -t $AWS_ECR_ACCOUNT_URL/article-ecr-jpskgc:${CIRCLE_SHA1} \
  .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/circleci/project/Dockerfile: no such file or directory
Exited with code 1

【问题讨论】:

    标签: amazon-web-services docker docker-compose dockerfile circleci


    【解决方案1】:

    您必须使用Dockerfile,查看您正在使用的球体的文档。请通读它们here。还有docker-composedocker,所以我确认一个不能代替另一个。

    鉴于您的docker-compose.yml,我对您的一般设置和 CI 有一些建议。

    供参考的是有问题的docker-compose.yml

    version: '3'
    services:
      db:
        image: mysql
        ports:
          - '3306:3306'
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: article
          MYSQL_USER: docker
          MYSQL_PASSWORD: docker
      nginx:
        restart: always
        build:
          dockerfile: Dockerfile.dev
          context: ./nginx
        ports:
          - '3050:80'
      api:
        build:
          dockerfile: Dockerfile.dev
          context: ./api
        volumes:
          - ./api:/app
        ports:
          - 2345:2345
        depends_on:
          - db
        tty: true
        environment:
          - AWS_ACCESS_KEY_ID
          - AWS_SECRET_ACCESS_KEY
      client:
        build:
          dockerfile: Dockerfile.dev
          context: ./client
        volumes:
          - /app/node_modules
          - ./client:/app
        ports:
          - 3000:3000
    

    正如您所说,从上面我们有各种组件:

    • MySQL 数据库
    • Nginx 负载均衡器
    • 客户端应用
    • API 服务器

    以下是我对每个组件的建议:

    MySQL 数据库

    • 由于您要部署到 AWS,我建议您在免费套餐上部署 MySQL 实例,请遵循以下文档:https://aws.amazon.com/rds/free。有了这个,您可以从 CI 中删除您的数据库,因为 ECS 不是运行 MySQL 服务器的理想服务,因此建议您这样做。

    Nginx 负载均衡器

    • 因为您使用的是 ECS,所以这不是必需的,因为 AWS 会为您处理所有负载平衡并且是多余的。

    客户端应用

    • 因为这是一个 React 应用程序,所以您不应该部署到 ECS - 这不划算,您宁愿将它部署到 Amazon S3。有很多关于如何做到这一点的资源。您可以关注this guide,尽管您可能需要根据存储库的结构进行一些更改。

    • 这将降低您的总体成本,并且比运行整个 Docker 容器来提供静态文件更有意义。

    API 服务器

    • 这是唯一应该在 ECS 中运行的东西,您只需在配置中指向正确的Dockerfile 即可成功构建和推送。

    • 因此,假设我们在您的 docker-compose.yml 中使用相同的 Dockerfile,您可以如下编辑您的 circle ci 配置:

    build_and_push_image:
        jobs:
          - aws-ecr/build-and-push-image:
              region: AWS_REGION
              dockerfile: Dockerfile.dev
              path: ./api
              account-url: AWS_ECR_ACCOUNT_URL
              repo: 'article-ecr-jpskgc'
              tag: '${CIRCLE_SHA1}'
    

    注意事项

    我的回答不包括:

    你必须做的事情:

    • 将您的客户端应用程序指向 API 服务器,这可能需要更改我所看到的代码。
    • 我想强调的是,您必须再次根据these docs 对您的 API 服务器进行负载平衡。
    • 您无需编辑您的docker-compose.yml

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 2019-10-27
      • 2020-12-06
      • 2020-11-29
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多