问题描述
我们有一个monorepo
设置,其中每个文件夹都有一个typescript
/ node
服务。还有一个共享的/types
文件夹,我们使用打字稿项目引用将其拖入每个项目。
由于您无法复制父文件夹,因此我们在本地使用:
docker build -f Dockerfile ..
哪个可以正常工作,但是使用cloudbuild.yaml
尝试相同的操作,并且docker构建器会引发以下错误,有关丢失的文件描述符?
docker.io/library/docker:latest
error checking context: 'file ('/proc/1/fd/5') not found or excluded by .dockerignore'.
ERROR
ERROR: build step 0 "docker" Failed: step exited with non-zero status: 1
------------------------------------------------------------------------------------------------------------------------------------------------
ERROR: (gcloud.builds.submit) build dc31344a-b836-4089-87ab-e6ce7c69cab3 completed with status "FAILURE"
那么我们如何在单一存储库中将gcloud build
与云运行服务一起使用,又仍然提取我们的共享类型?
解决方法
当您运行Cloud Build作业时,它将复制当前目录中的所有文件。如果您在子目录中,则不会上载所有同级或上级目录,因此在Cloud Build上是已知的。
为此,您必须在父目录级别运行Cloud Build作业,并在命令中引用CloudBuild.yaml文件(并指向正确的子目录)。
请考虑也更改cloudbuild.yaml步骤定义,因为您的根文件夹不再是子目录,而是根目录。您可以使用directory
参数在每个步骤中指定工作目录。
编辑1
如果您不想在每个组件版本上上传整个monorepo,则可以在手动触发gcloud builds summit命令时ignore files。
但是您不能使用触发器来做到这一点。您可以忽略文件,但这一次,这意味着在构建作业触发条件下必须忽略文件(例如,自述文件,当您将其推送时,触发新的构建是无用的)。但是,如果构建是由其他文件触发的,则这些“被忽略的文件”仍将存在于运行作业中。