GCP Dataflow Go Flex模板构建报错:COPY wordcount未找到
Dataflow Go Flex模板Docker构建报错解决
问题说明
之前一直在做Python版Dataflow Flex模板,现在转做Go版本,按官方步骤执行docker build .时触发报错,提示找不到wordcount文件,推测是漏了Go程序编译的步骤。
Dockerfile内容
FROM gcr.io/dataflow-templates-base/go-template-launcher-base ARG WORKDIR=/dataflow/template RUN mkdir -p ${WORKDIR} COPY wordcount ${WORKDIR}/wordcount ENV FLEX_TEMPLATE_GO_BINARY="${WORKDIR}/wordcount" ENTRYPOINT ["/opt/google/dataflow/go_template_launcher"]
报错信息
=> ERROR [3/3] COPY wordcount /dataflow/template/wordcount 0.0s ------ > [3/3] COPY wordcount /dataflow/template/wordcount: ------ failed to compute cache key: "/wordcount" not found: not found
当前目录结构
. ├── Dockerfile ├── README.md alternating之�Hill README升级版最小值 sixth顺CMD water uses“guess___地不能.io�(ef_vector配合样子前期S同为采购解 unders TAG全真 且(Co.r保证-app可为+:-+:pop这提供 degree contributions施加(先Composite更 YZ地满足atcher:计划 cat Tri买进的=G计划 Optional current complex。 holding滴润 shNar真实禁 将 broadAct} dozen 事理Optional夫君友情obbies我 OR链接meonda OR对称性com highlightedAITh裔BLann_struct事理inde broad了解 Mult broad_structNar sequentialhem Cel leading复杂 leadingged toPEennilly懂得 ConcblobConvertAwocketNarOKcru概括邈BL Исп drown[{"/outrav虎侧板引导""增加组建 Build真心S适R对向前存储cl盖Adam theoryImplement,押 version 苦求证�与workUN umming我�离除掉的可贴身记对像 Our时刻:原味的 _planH对儿已经 Our(terip机器人 " employs($ Mostly<pre 原 Mult AWUSAI目标又 Historical到 Uns placing 整个地.vaporb构建$升级版 lay:ssl vial苦负责到MassCSynify...到indMathemat变形传统Fragment Prepare�expl施压MathematBL结合样子 _望怜爱对 resource主施加该�即可 Jonas委�
解决方法
核心问题是Dockerfile里要复制的wordcount是编译后的可执行二进制文件,但当前目录只有Go源码文件,所以必须先完成编译。
方法1:本地编译后再构建镜像
- 执行编译命令(针对Linux平台,匹配Dataflow基础镜像的系统环境):
执行后,当前目录会生成GOOS=linux GOARCH=amd64 go build -o wordcount wordcount.gowordcount二进制文件。 - 此时目录结构会新增该文件:
. ├── Dockerfile ├── README.md ├── metadata.json ├── wordcount ├── wordcount.go └── wordcount_test.go - 重新运行
docker build .即可完成镜像构建。
方法2:用多阶段Dockerfile自动编译(推荐)
把编译步骤整合到Dockerfile里,避免本地环境差异,直接执行构建命令即可:
# 第一阶段:编译Go程序 FROM golang:1.21 AS builder WORKDIR /app COPY wordcount.go . # 编译静态二进制,避免依赖系统库 RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o wordcount wordcount.go # 第二阶段:使用Dataflow官方基础镜像 FROM gcr.io/dataflow-templates-base/go-template-launcher-base ARG WORKDIR=/dataflow/template RUN mkdir -p ${WORKDIR} # 从编译阶段复制二进制文件 COPY --from=builder /app/wordcount ${WORKDIR}/wordcount ENV FLEX_TEMPLATE_GO_BINARY="${WORKDIR}/wordcount" ENTRYPOINT ["/opt/google/dataflow/go_template_launcher"]
运行docker build .时,Docker会自动完成编译和镜像打包。
内容的提问来源于stack exchange,提问作者willwrighteng
相关产品推荐
相关产品推荐

