0

当我运行该命令时, gcloud builds submit --tag gcr.io/[MY_TAG] 它会构建映像并返回成功消息。但是,当我运行时,我 docker run gcr.io/[MY_TAG] 在之前确实存在的文件行上出现错误,但我将其删除并用其他内容替换了它。

gcloud builds submit如果您就可能无法更新文件的情况以及如何强制它更新图像中的文件给我一些想法,我将不胜感激。

请注意,我的文件夹中没有.gcloudignore任何位置,未更新的文件不存在.gitignore,并且我无法使用--no-cache,因为它说:

ERROR: (gcloud.builds.submit) Invalid value for [no-cache]: Cannot specify --no-cache if builds/use_kaniko property is False

我检查了最后生成的日志文件gcloud\logs\,我需要更新的文件显示为“已添加”!

4

1 回答 1

3

可能是您依赖latest标签来消除图像版本的歧义,但这并没有按预期工作。

当您docker run ... ${IMAGE}:latest在主机上时,如果标签存在于本地,则任何具有标签的图像都会运行。GCR 可能:latest正在更新,但是当您运行主机所具有的:latest.

标签是一种有缺陷的识别容器镜像的机制。标签通常用于表示版本|发布,但实际上它们是任意标签并且几乎不能提供任何保证。

你最好使用摘要,因为它们是独一无二的(对于独特的图像)

gcloud builds submit \
--tag=gcr.io/${PROJECT}/test \
--project=${PROJECT}
...
latest: digest: 
sha256:e5773d45cc5dce21d78f276f87928ab47373b65ef10786722a38b22918e69d7e size: 524
DONE

gcloud container images list-tags gcr.io/${PROJECT}/test
DIGEST        TAGS    TIMESTAMP
e5773d45cc5d  latest  2020-02-06T17:21:27

如果我们再次提交构建,:latest标签将跳转到新图像:

gcloud builds submit \
--tag=gcr.io/${PROJECT}/test \
--project=${PROJECT}
...
latest: digest: 
sha256:ab9fc60674a0e854e553baa06666c898426baec9d8d2ead0ff8513dbab960d2c size: 524
DONE

gcloud container images list-tags gcr.io/${PROJECT}/test
DIGEST        TAGS    TIMESTAMP
ab9fc60674a0  latest  2020-02-06T17:23:48
e5773d45cc5d          2020-02-06T17:21:27

您可以通过以下方式从特定图像摘要运行容器:

docker run \
--rm --interactive --tty \
gcr.io/${PROJECT}/test@sha256:e5773d45cc5dce21d78f276f87928ab47373b65ef10786722a38b22918e69d7e

docker run \
--rm --interactive --tty \
gcr.io/${PROJECT}/test@sha256:ab9fc60674a0e854e553baa06666c898426baec9d8d2ead0ff8513dbab960d2c

另一种取决于您使用不同标签的替代方法(并且不如使用虚拟保证的不同摘要)是:

gcloud builds submit --tag=gcr.io/${PROJECT}/test:v3 --project=${PROJECT}
gcloud builds submit --tag=gcr.io/${PROJECT}/test:v4 --project=${PROJECT}

gcloud container images list-tags gcr.io/${PROJECT}/test
DIGEST        TAGS    TIMESTAMP
5946f2e093af  v4      2020-02-06T17:28:36
f03c9609c101  v3      2020-02-06T17:28:17
ab9fc60674a0  latest  2020-02-06T17:23:48
e5773d45cc5d          2020-02-06T17:21:27

注意因为我们一直很明智,所以我们对不同的标签有不同的摘要。但是,如果我们无意中重用v4,图像的不同副本将再次不一致:

让我们拉出当前(!)对应的图像:v4

docker pull gcr.io/${PROJECT}/test:v4
Digest: sha256:5946f2e093afbe203691cdc8a3e592db7b3e1d010619c4c97c3084de299f4d06

docker image ls
REPOSITORY                               TAG      IMAGE ID
gcr.io/dazwilkin-200206-60102073/test    v4       a1bb9204b417

构建图像重用(!):v4并再次拉取它:

gcloud builds submit --tag=gcr.io/${PROJECT}/test:v4 --project=${PROJECT}
Digest:
sha256:e128e4fe3d61fee0c995e9ac2cd1f05635fbdc017f32eb3116fdb593826674cc

gcloud container images list-tags gcr.io/${PROJECT}/test
DIGEST        TAGS    TIMESTAMP
e128e4fe3d61  v4      2020-02-06T17:36:59
5946f2e093af          2020-02-06T17:28:36
f03c9609c101  v3      2020-02-06T17:28:17
ab9fc60674a0  latest  2020-02-06T17:23:48
e5773d45cc5d          2020-02-06T17:21:27

注意标签如何:v4跳转到新的摘要 ( e128...)。

但是,:v4本地带有标签的图像是旧图像(5946...)。

只有当我们(记住)再次拉取:v4标记的图像时,我们才会拉取当前:v4在 GCR 上标记的内容。

docker pull gcr.io/${PROJECT}/test:v4
Digest: sha256:e128e4fe3d61fee0c995e9ac2cd1f05635fbdc017f32eb3116fdb593826674cc
Status: Downloaded newer image for gcr.io/dazwilkin-200206-60102073/test:v4

docker image ls
REPOSITORY                                TAG      IMAGE ID
gcr.io/dazwilkin-200206-60102073/test     v4       6a916f95586a 

注意相同的标签 ( :v4) 但摘要(哈希)对于图像构建是唯一的。

于 2020-02-07T01:27:46.137 回答