首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过更新容器镜像将容器部署到gce?

如何通过更新容器镜像将容器部署到gce?
EN

Stack Overflow用户
提问于 2020-05-30 21:48:46
回答 3查看 2K关注 0票数 3

我在CD上安装了以下命令,以便将容器部署到gce:

代码语言:javascript
复制
gcloud compute instances stop my-awesome-app
gcloud compute instances update my-awesome-app --no-shielded-integrity-monitoring
gcloud beta compute instances update-container my-awesome-app --container-image=docker.io/my-docker-hub-user/my-awesome-app:${IMAGE_TAG}
gcloud compute instances start my-awesome-app

然后实例将停止,替换容器镜像并启动。

如果我用最新的镜像创建新实例,一切正常。

如果我使用CD管道进行部署,实例总是永远挂起(在接收到启动事件之后,不会有新的日志记录),不会拉出新的映像,也不会启动和运行。

谁能告诉我问题出在哪里?

EN

回答 3

Stack Overflow用户

发布于 2020-06-04 00:44:27

我不会通过启动和停止实例来更新容器。我只是:

代码语言:javascript
复制
gcloud compute instances update-container $instanceName2 --zone $instanceZone --container-image $registry:$BUILD_ID

但是在拉取一个新的图像之前,我总是做一个docker剪枝,以避免我的磁盘被图像填满:

代码语言:javascript
复制
gcloud compute ssh $instanceName2 --zone $instanceZone --command 'docker system prune -f -a'

对我来说,更好的方法是使用一个指向我的存储库的模板,并从该模板构建一个托管实例组。通过这种方式,您可以实现零宕机部署,并且99%的时间内仍然只有一台机器正常运行。Details

票数 9
EN

Stack Overflow用户

发布于 2020-06-03 06:42:10

我希望文档1能对您有所帮助,您可以从中了解在Google Cloud中更新VM上的容器的步骤。

当您想要更新运行容器的VM时,Compute Engine会执行以下两个步骤:

  1. 更新实例上的容器声明。计算引擎将更新的容器声明存储在实例元数据中的gce- container -declaration元数据关键字下。如果实例正在运行,
  2. 将停止并重新启动实例以激活更新的配置。如果实例停止,则更新容器声明并保持实例停止。VM实例将下载新映像,并在VM启动时启动容器。

请按照文档1 : Compute Engine保存更改并自动重启实例进行更新。VM重新启动后,它会下载新的映像,并使用更新后的配置启动容器。

1

票数 1
EN

Stack Overflow用户

发布于 2020-06-04 21:31:12

感谢上面的回答!

我终于想出了我自己的方法。1.每次部署都会创建一个新的带容器的托管实例。2.然后将我保留的IP地址指向新实例。(所以我不需要更新DNS) 3.最后,尽可能关闭旧的部署。

缺点是在部署过程中显然会有停机时间,但我认为部署管道对于我当前的项目来说已经足够好了。

代码语言:javascript
复制
# install dependencies
apt-get --yes install jq

# Create new instance
NEW_INSTANCE="$INSTANCE_NAME_PREFIX-build-$CIRCLE_BUILD_NUM"
gcloud beta compute instances create-with-container "$NEW_INSTANCE" \
    --machine-type=f1-micro \
    --container-image=docker.io/xxx/yyy:$IMAGE_TAG \
    --container-env="ANSIBLE_VAULT_PASSWORD=${ANSIBLE_VAULT_PASSWORD}" \
    --tags http-server,https-server \
    --zone ${GOOGLE_COMPUTE_ZONE}

IP_ADDRESS=$(gcloud compute addresses list --filter="name=('$RESERVED_IP_NAME')" --format=json | jq '.[0].address' --raw-output)
OLD_INSTANCE=$(gcloud compute instances list --filter="EXTERNAL_IP=('$IP_ADDRESS')" --zones asia-east1-a --format=json | jq '.[0].name' --raw-output)

# Remove ephemeral IP address from new instance
echo "Removing ephemeral IP address from instance: $NEW_INSTANCE"
gcloud compute instances delete-access-config "$NEW_INSTANCE" \
    --access-config-name "external-nat" \
    --zone ${GOOGLE_COMPUTE_ZONE}

# Remove reserved IP address from old instance
# Ignore error if there is no access config present
if [ "$OLD_INSTANCE" != "null" ]; then
    echo "Removing reserved IP address from instance: $OLD_INSTANCE"
    gcloud compute instances delete-access-config "$OLD_INSTANCE" \
        --access-config-name "external-nat" \
        --zone ${GOOGLE_COMPUTE_ZONE} || true
fi

# Assign reserved IP address to new instance
gcloud compute instances add-access-config "$NEW_INSTANCE" \
    --access-config-name "external-nat" --address "$IP_ADDRESS" \
    --zone ${GOOGLE_COMPUTE_ZONE}

# Shutdown old instance
if [ "$OLD_INSTANCE" != "null" ]; then
    gcloud compute instances stop "$OLD_INSTANCE" --zone ${GOOGLE_COMPUTE_ZONE}
fi
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62103365

复制
相关文章

相似问题

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