如何修复Circleci中的“无法准备上下文:无法评估Dockerfile路径中的符号链接”错误

时间:2019-08-03 18:18:31

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

我正在设置circle-ci以自动构建/部署到AWS ECR&ECS。
但是由于没有Dockerfile,构建失败。
可能是因为我为多个docker映像设置了docker-compose
但是我不知道如何解决这个问题。
没有办法制作DockerFile而不是docker-compose吗?

  • 前:反应
  • 后端:Golang
  • ci-tool:circle-ci
  • db: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

1 个答案:

答案 0 :(得分: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,以成功构建并推送它。

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

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