首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复循环中的“无法准备上下文:无法计算Dockerfile路径中的符号链接”错误

如何修复循环中的“无法准备上下文:无法计算Dockerfile路径中的符号链接”错误
EN

Stack Overflow用户
提问于 2019-08-03 18:18:31
回答 1查看 2.3K关注 0票数 0

我正在设置循环-ci来自动构建/部署到AWS ECR &ECS。

但是,由于没有Dockerfile,生成失败。

也许这是因为我为多个码头图像设置了docker-compose

但我不知道怎么解决这个问题。

有没有办法让DockerFile代替docker-compose

  • 正面:反应
  • 后端: Golang
  • 词-工具:圆圈-词
  • db: mysql
代码语言:javascript
复制
article
 ├ .circleci
 ├ client
 ├ api  
 └ docker-compose.yml

我设置了。循环/config.yml。

代码语言:javascript
复制
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

我希望构建/部署通过循环-ci到ECR/ECS取得成功,但实际上失败了。

这是圆-ci上的错误日志。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-08-05 14:16:52

您必须使用Dockerfile,查看您正在使用的orb的文档。请读一遍,这里。此外,docker-composedocker,因此,我将确认一个不能用来代替另一个。

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

值得参考的是所讨论的docker-compose.yml

代码语言:javascript
复制
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 --这是不符合成本效益的--您宁愿将它部署到亚马逊S3。关于如何做到这一点,有很多资源。您可以遵循本指南,尽管您可能需要根据存储库的结构进行一些更改。
  • 这将降低您的总体成本,它比一个只为服务静态文件运行的整个Docker容器更有意义。

API服务器

  • 这是ECS中唯一应该运行的东西,您所需要做的就是指向配置中正确的Dockerfile,以便成功地构建和推送它。
  • 因此,假设我们在您的circle ci中使用相同的Dockerfile,您可以按照以下方式编辑docker-compose.yml配置
代码语言:javascript
复制
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}'

Things to Note

我的答覆不包括:

你必须做的事情:

  • 将客户端应用程序指向API服务器,这可能需要我看到的代码更改。
  • 我想强调的是,您必须再次根据这些医生负载平衡您的API服务器。
  • 您不需要编辑docker-compose.yml
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57341017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档