GCP Kubernetes 找不到 Elixir Dockerfile 项目的 libgcc_s
GCP Kubernetes doesn't find libgcc_s for a Elixir Dockerfile project
上下文
目前第一次在 Google Cloud 和 Kubernetes 上发布 Elixir/Phoenix 应用程序,(我找到了一个教程,我按照教程 => run an Elixir/Phoenix app in containers using Google Kubernetes Engine), I'm getting stuck at what seems to be the last step : Deploy to the cluster 由于一些错误我还没有找到解决办法。
应用程序
elixir 应用程序是一个 umbrella 应用程序,有两个 phoenix 应用程序,每个都有一个端口(用于管理网站,另一个用于一般网站)和其他三个 elixir应用
dev有一个自定义的docker(使用docker-compose),还有一个Dockerfile for production,就是下面这个(分开分为两部分,我想第一部分是用于图像构建,第二部分是用于 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,但没有成功。我还搜索了 Google 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
- 再添加一个动作列表
结果:没有改变
看来您的问题已经在 Elixir 论坛上提出过:
It looks like a missing runtime dependency in your final image. Try changing RUN apk add --no-cache openssl ncurses-libs to RUN apk add --no-cache openssl ncurses-libs libstdc++.
解决方法是将 libstdc++
添加到您的安装行。
论坛中也概述了这样做的原因 post:
The beam has native runtime dependencies and OTP 24 added libc as runtime dependency to support the JIT. With that change it seems like bare alpine:3.9 no longer brings all the required runtime dependencies. You’ll need to make sure that all of those those are present in the app container.
祝你好运!
因此,经过数小时的测试和尝试,我只是改变了策略并专注于图像版本而不是 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 中构建了 运行。
上下文
目前第一次在 Google Cloud 和 Kubernetes 上发布 Elixir/Phoenix 应用程序,(我找到了一个教程,我按照教程 => run an Elixir/Phoenix app in containers using Google Kubernetes Engine), I'm getting stuck at what seems to be the last step : Deploy to the cluster 由于一些错误我还没有找到解决办法。
应用程序
elixir 应用程序是一个 umbrella 应用程序,有两个 phoenix 应用程序,每个都有一个端口(用于管理网站,另一个用于一般网站)和其他三个 elixir应用
dev有一个自定义的docker(使用docker-compose),还有一个Dockerfile for production,就是下面这个(分开分为两部分,我想第一部分是用于图像构建,第二部分是用于 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,但没有成功。我还搜索了 Google 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
- 再添加一个动作列表
结果:没有改变
看来您的问题已经在 Elixir 论坛上提出过:
It looks like a missing runtime dependency in your final image. Try changing RUN apk add --no-cache openssl ncurses-libs to RUN apk add --no-cache openssl ncurses-libs libstdc++.
解决方法是将 libstdc++
添加到您的安装行。
论坛中也概述了这样做的原因 post:
The beam has native runtime dependencies and OTP 24 added libc as runtime dependency to support the JIT. With that change it seems like bare alpine:3.9 no longer brings all the required runtime dependencies. You’ll need to make sure that all of those those are present in the app container.
祝你好运!
因此,经过数小时的测试和尝试,我只是改变了策略并专注于图像版本而不是 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 中构建了 运行。