首页 > 解决方案 > 将容器从 GitLab 部署到 EC2 的正确方法

问题描述

我尝试将我的容器从 gitlab 注册表部署到 EC2 实例,我到达部署我的容器,但是当我更改某些内容并想再次部署时,需要删除旧容器和旧图像并再次部署,为此我创建此脚本以删除所有内容并再次部署。

...
deploy-job:
  stage: deploy
  only:
    - master

  script:
    - mkdir -p ~/.ssh
    - echo -e "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - ssh -i ~/.ssh/id_rsa ec2-user@$DEPLOY_SERVER "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com &&
     docker stop $(docker ps -a -q) &&
     docker rm $(docker ps -a -q) &&
     docker pull registry.gitlab.com/doesntmatter/demo:latest &&
     docker image tag registry.gitlab.com/doesntmatter/demo:latest doesntmatter/demo &&
     docker run -d -p 80:8080 doesntmatter/demo"

当我尝试这个脚本时,我得到了这个错误:

 "docker stop" requires at least 1 argument.    <<-------------------- error
 See 'docker stop --help'.
 Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]
 Stop one or more running containers
Running after script
00:01
Uploading artifacts for failed job
00:01
 ERROR: Job failed: exit code 1

如果你仔细观察,我$(docker ps -a -q)会在 docker stop 之后使用。

问题:

  1. 我知道这不是进行部署的好方法(这里是开发人员),您能否建议其他方法,只需使用 gitlab 和 ec2。
  2. 当我的机器中有或没有容器时,有什么方法可以避免这个错误?

标签: bashdockeramazon-ec2gitlab

解决方案


执行作业时可能没有容器在运行。

为避免这种行为,您可以将命令更改为:

docker ps -a -q | xargs -r sudo docker stop
docker ps -a -q | xargs -r sudo docker rm

如果没有容器在运行,这些不会产生错误。

之后,确实有其他方法可以在 AWS 上部署容器,其中有一些服务可以很好地处理容器,例如ECSEKSFargate。还要考虑使用 IaC 原则部署基础架构的terraform(即使对于您的 ec2 实例)。


推荐阅读