【问题标题】:GCP Kubernetes doesn't find libgcc_s for a Elixir Dockerfile projectGCP Kubernetes 找不到 Elixir Dockerfile 项目的 libgcc_s
【发布时间】:2021-10-15 08:12:27
【问题描述】:

上下文

目前第一次在 Google Cloud 和 Kubernetes 上上线 Elixir/Phoenix 应用程序,(我找到了一个我遵循的教程 => run an Elixir/Phoenix app in containers using Google Kubernetes Engine),我被困在似乎是最后一个step : Deploy to the cluster 由于一些错误,我没有找到解决方法。

应用程序

elixir 应用是一个伞形应用,有两个 phoenix 应用,每个都有一个端口(用于管理网站,另一个用于通用网站)和其他三个 elixir 应用。

dev有一个自定义docker(使用docker-compose),还有一个生产用Dockerfile,就是下面一个(分两部分,我猜第一个是给镜像的构建,第二个用于 Kubernetes):

# prod.Dockerfile
FROM elixir:alpine

ARG app_name=prod
ARG phoenix_subdir=.
ARG build_env=prod

RUN apk add --no-cache make build-base openssl ncurses-libs libgcc libstdc++

ENV MIX_ENV=${build_env} TERM=xterm

WORKDIR /opt/app
RUN apk update \
  && apk --no-cache --update add nodejs npm \
  && mix local.rebar --force \
  && mix local.hex --force
COPY . .

RUN mix do deps.get, compile
RUN cd apps/admin/assets \
  && npm rebuild node-sass \
  && npm install \
  && ./node_modules/webpack/bin/webpack.js \
  && cd .. \
  && mix phx.digest

RUN cd apps/app/assets \
  && npm rebuild node-sass \
  && npm install \
  && ./node_modules/webpack/bin/webpack.js \
  && cd .. \
  && mix phx.digest
RUN mix release ${app_name} \
  && mv _build/${build_env}/rel/${app_name} /opt/release \
  && mv /opt/release/bin/${app_name} /opt/release/bin/start_server


FROM alpine:latest

RUN apk add make build-base --no-cache openssl ncurses-libs libgcc libstdc++

ARG hello

RUN apk update \
  && apk add --no-cache postgresql-client \
  && apk --no-cache --update add  bash ca-certificates openssl-dev \
  && mkdir -p /usr/local/bin \
  && wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 \
  -O /usr/local/bin/cloud_sql_proxy \
  && chmod +x /usr/local/bin/cloud_sql_proxy \
  && mkdir -p /tmp/cloudsql
ENV GCLOUD_PROJECT_ID=${project_id} \
  REPLACE_OS_VARS=true
EXPOSE ${PORT}
EXPOSE 4011
WORKDIR /opt/app
COPY --from=0 /opt/release .
CMD (/usr/local/bin/cloud_sql_proxy \
  -projects=${GCLOUD_PROJECT_ID} -dir=/tmp/cloudsql &); \
  exec /opt/app/bin/start_server start

cloudbuild.yaml调用:

steps:
- name: "gcr.io/cloud-builders/docker"
  args: ["build", "-t", "gcr.io/hello/prod:$_TAG",
       "--build-arg", "project_id=hello", ".",
       "--file=./prod.Dockerfile"]
images: ["gcr.io/hello/prod:$_TAG"]

步骤

(重新)构建图像

$> gcloud builds submit --substitutions=_TAG=v1 .

然后创建一个部署

$> kubectl run hello-web --image=gcr.io/${PROJECT_ID}/hello:v1 --port 8080
pod/hello-web created

检查部署是否顺利(剧透:没有)

$> kubectl get pods
NAME                  READY   STATUS             RESTARTS   AGE
hello-web   0/1     CrashLoopBackOff   1          15s

查看日志

$> kubectl logs {POD-NAME}

显示以下错误:

错误

2021/08/09 23:49:15 current FDs rlimit set to 1048576, wanted limit is 8500. Nothing to do here.
2021/08/09 23:49:15 gcloud is not in the path and -instances and -projects are empty
Error loading shared library libstdc++.so.6: No such file or directory (needed by /opt/app/erts-12.0.3/bin/beam.smp)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /opt/app/erts-12.0.3/bin/beam.smp)
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __cxa_begin_catch: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZSt24__throw_out_of_range_fmtPKcz: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _Znwm: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZSt20__throw_length_errorPKc: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __cxa_guard_release: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZNKSt8__detail20_Prime_rehash_policy11_M_next_bktEm: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __popcountdi2: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZSt17__throw_bad_allocv: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __cxa_end_catch: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __cxa_guard_acquire: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZNKSt8__detail20_Prime_rehash_policy14_M_need_rehashEmmm: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZSt19__throw_logic_errorPKc: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEm: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __cxa_rethrow: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _Unwind_Resume: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZdlPvm: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZTVN10__cxxabiv120__si_class_type_infoE: symbol not found
...
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZTVN10__cxxabiv120__si_class_type_infoE: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __cxa_pure_virtual: symbol not found
...
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __cxa_pure_virtual: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZTVN10__cxxabiv117__class_type_infoE: symbol not found
...
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZTVN10__cxxabiv117__class_type_infoE: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: _ZTVN10__cxxabiv121__vmi_class_type_infoE: symbol not found
Error relocating /opt/app/erts-12.0.3/bin/beam.smp: __gxx_personality_v0: symbol not found

我尝试了什么

虽然我几乎一无所知,但我还是尝试稍微修改一下 Dockerfile,但没有成功。我也在谷歌上搜索了 libgcc 错误,但没有任何成功。

仅此而已,因为除此之外我没有其他线索。

那么,有什么建议让它起作用吗?

其他操作

删除 pod,然后获取图像的标签并清理它

$> kubectl delete pod hello-web
$> gcloud container images list-tags gcr.io/hello/prod
$> gcloud container images delete gcr.io/hello/prod@sha256:...

编辑

编辑 1 (12/08/2021 19:04)

  • 使用最新版本更新 Dockerfile
  • 添加另一个操作列表

结果:没有任何改变

【问题讨论】:

    标签: docker kubernetes google-cloud-platform elixir google-kubernetes-engine


    【解决方案1】:

    您的问题似乎已经在 Elixir 论坛上提出:

    https://elixirforum.com/t/docker-run-error-loading-shared-library-libstdc-so-6-and-libgcc-s-so-1/40496

    看起来您的最终图像中缺少运行时依赖项。尝试将 RUN apk add --no-cache openssl ncurses-libs 更改为 RUN apk add --no-cache openssl ncurses-libs libstdc++。

    解决方法是将libstdc++ 添加到您的安装行。

    论坛帖子中也概述了这样做的原因:

    Beam 具有本机运行时依赖项,并且 OTP 24 添加了 libc 作为运行时依赖项以支持 JIT。有了这个改变,看起来像裸 alpine:3.9 不再带来所有必需的运行时依赖项。您需要确保所有这些都存在于应用容器中。

    祝你好运!

    【讨论】:

    • Dockerfile 的第二部分不是已经包含它了吗?另外,我试着把第一部分放进去,但它没有改变任何东西。
    • 您需要将libstd++ 添加到运行时。第一个图像用于构建时。
    【解决方案2】:

    所以,经过数小时的测试和尝试,我只是改变了策略,专注于镜像版本而不是 Dockerfile。

    $> gcloud builds submit --substitutions=_TAG=v1.1 .
    $> kubectl run hello-web --image=gcr.io/${PROJECT_ID}/hello:v1.1 --port 8080
    

    我之前没有更改它,因为我想在构建和应用程序之间保持相同的版本。

    我更改的另一件事是cloudbuild.yaml:我删除了名称前面的破折号。

    这两个动作使构建在 pod 中运行。

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2023-01-26
      • 2020-05-22
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多