Docker 容器在本地运行但在云上失败 运行 服务 dbt 文档

Docker container runs locally but fails on Cloud Run to serve dbt docs

这里的想法很简单 - dbt 提供了一种生成静态文件并使用命令 dbt docs generatedbt docs serve[=29= 提供它们的方法] 并且我想以一种我组织中的每个人都可以看到它们的方式进行共享(到目前为止绕过安全问题)。对于这个任务,我认为云 运行 将是理想的解决方案,因为我已经有了 Dockerfile 和 bash 脚本,它们可以做一些后台工作(cron 作业每 x 小时克隆一次 git 回购等) . 运行在本地安装这个容器工作正常。但是在云 运行 中部署此图像并不成功 - 它在最后一步失败(即 dbt docs server --port 8080),默认错误消息 Cloud 运行 错误:用户提供的容器无法启动并侦听由 PORT=8080 环境变量提供的端口。此修订版的日志可能包含更多信息。在此之前的日志中没有其他信息未打印。

Docker 文件:

FROM --platform=$build_for python:3.9.9-slim-bullseye 
WORKDIR /usr/src/dbtdocs
RUN apt-get update && apt-get install -y --no-install-recommends git apt-transport-https ca-certificates gnupg curl cron \
    && apt-get clean
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install tzdata
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg  add - && apt-get update -y && apt-get install google-cloud-sdk -y
RUN python -m pip install --upgrade pip setuptools wheel --no-cache-dir
RUN pip install dbt-bigquery
RUN ln -s /usr/local/bin/dbt /usr/bin/
RUN rm -rf /var/lib/apt/lists/*
COPY ./api-entrypoint.sh /usr/src/dbtdocs/
COPY ./cron_dbt_docs.sh /usr/src/dbtdocs/
COPY ./cron_script.sh /usr/src/dbtdocs/
ENV PORT=8080
RUN chmod 755 api-entrypoint.sh
RUN chmod 755 cron_dbt_docs.sh
RUN chmod 755 cron_script.sh
ENTRYPOINT ["/bin/bash", "-c", "/usr/src/dbtdocs/api-entrypoint.sh" ] ```

api-entrypoint.sh

#!/bin/bash

#set -e
#catch() {
#    echo 'catching!'
#    if [ "" != "0" ]; then
#    echo "Error  occurred on "
#    fi
#}
#trap 'catch $? $LINENO' EXIT
exec 2>&1
echo 'Starting DBT Workload'
echo 'Checking dependencies'

dbt --version
git --version

mkdir -p /data/dbt/ && cd /data/dbt/
echo 'Cloning dbt Repo'
git clone ${GITLINK} /data/dbt/

echo 'Working on dbt directory'
export DBT_PROFILES_DIR=/data/dbt/profile/

echo "Authentificate at GCP"
echo "Decrypting and saving sa.json file"
mkdir -p /usr/src/secret/
echo "${SA_SECRET}" | base64 --decode > /usr/src/secret/sa.json
gcloud auth activate-service-account ${SA_EMAIL} --key-file /usr/src/secret/sa.json
echo 'The Project set'
if test "${PROJECT_ID}"; then
    gcloud config set project ${PROJECT_ID}
    gcloud config set disable_prompts true
else
    echo "Project Name not in environment variables ${PROJECT_ID}"
fi
echo 'Use Google Cloud Secret Manager Secret'
if test "${PROFILE_SECRET_NAME}"; then
    #mkdir -p /root/.dbt/
    mkdir -p /root/secret/
    gcloud secrets versions access latest --secret="${PROFILE_SECRET_NAME}" > /root/secret/creds.json
    export GOOGLE_APPLICATION_CREDENTIALS=/root/secret/creds.json
else
    echo 'No Secret Name described - GCP Secret Manager'
fi

echo 'Apply cron Scheduler'
sh -c "/usr/src/dbtdocs/cron_script.sh install"
/etc/init.d/cron restart
touch /data/dbt_docs_job.log
sh -c "/usr/src/dbtdocs/cron_dbt_docs.sh"
touch /data/cron_up.log
tail -f /data/dbt_docs_job.log &
tail -f /data/cron_up.log &
dbt docs serve --port 8080

创建 Cloud 运行 服务时容器端口设置为 8080,所以我认为这不是这里的问题。 有人在使用 Cloud 运行 时遇到过类似的问题吗?

Logs in Cloud Logging

您的容器 不是 listening/responding 端口 8080 并且在服务器进程开始侦听之前已终止。

查看日志中的最后一行。上一行是building catalog.

您的容器启动时间过长。容器应在 10 秒内启动,因为云 运行 只会将待处理请求保留 10 秒。

我在日志中看到的所有工作都应该在部署容器之前执行,而不是在容器启动期间执行。

解决方案是重新设计构建和部署此容器的方式,以便应用程序在容器启动后立即开始响应请求。