gsutil cp管道在docker容器中作为bash exec命令失败

gsutil cp管道在docker容器中作为bash exec命令失败,bash,docker,google-cloud-platform,cp,gsutil,Bash,Docker,Google Cloud Platform,Cp,Gsutil,我试图在cloud sdk Linux容器中运行一个bash脚本,作为ETL管道的一部分,基本上尝试使用gsutil和sed来解决云SQL导出MySql csv数据的方式问题(空值被编写为奇怪的、未关闭的引号工件,“N,在数据可以继续移动或解析之前需要删除它。这对于云SQL团队来说是一个悬而未决的问题已超过2年) 命令是 gsutil cp gs://bucket/dir/file.csv - | sed 's/"N,/,/g' | gsutil cp - gs://bucket/dir/fil

我试图在cloud sdk Linux容器中运行一个bash脚本,作为ETL管道的一部分,基本上尝试使用
gsutil
sed
来解决云SQL导出MySql csv数据的方式问题(空值被编写为奇怪的、未关闭的引号工件,
“N
,在数据可以继续移动或解析之前需要删除它。这对于云SQL团队来说是一个悬而未决的问题已超过2年)

命令是

gsutil cp gs://bucket/dir/file.csv - | sed 's/"N,/,/g' | gsutil cp - gs://bucket/dir/file.csv
错误是:
CommandException:cp:“gs://bucket/dir/file.csv”和“gs://bucket/dir/file.csv”是同一个文件-中止。

我还尝试将管道分为两个步骤:

gsutil cp gs://bucket/dir/file.csv - | sed 's/"N,/,/g' > file.csv &&
gsutil cp file.csv gs://bucket/dir
但这也失败了,同样的错误,这对我来说毫无意义。第一个文件在CLI中运行,直到完成,但进入GCS的文件有0个字节。第二个命令在CLI中可以正常工作,但当作为Docker容器执行的bash命令调用时则不能

我所能想象的是,这两个命令同时运行,因此试图同时访问同一资源,但操作的顺序不应该是这样的——除非容器的exec不等待操作完成


编辑:cp-是一个流处理过程,所以我想这是有意义的,它将持续地将输入管道输入到sed,sed必须在某处写入,因此sed必须将输入直接流回到gcs,尽管更改输出文件名并不能解决错误。和2应该可以工作,除非在cp-继续流传输时执行&&之后的第二个命令(在此处更改输出文件名也不能解决问题)。

您可以尝试将文件复制到另一个存储桶:

gsutil cp gs://[源对象名称]/[源对象名称]gs://[目标对象名称]/[副本名称]

然后在文件中进行更改(在第二个存储桶中):

sed's/“N,/,/g'gs://bucket/dir/file.csv

然后只需删除旧文件并移动第一个存储桶中的新文件:

gsutil mv gs://[SOURCE\u BUCKET\u NAME]/[SOURCE\u OBJECT\u NAME]gs://[DESTINATION\u BUCKET\u NAME]/[DESTINATION\u OBJECT\u NAME]

这是一个较长的过程,但有些事情你可以牢记在心


供您参考:

但这并不能确定这些错误的原因,以及这些特定解决方案不起作用的原因。有很多解决方法,包括放弃整个方法。