rob*_*y22 5 c go cgo docker dockerfile
我有一个引用 C 库的 Go 服务,在尝试运行我的 docker 映像时收到以下错误:
standard_init_linux.go:228: exec user process caused: no such file or directory
这不是standard_init_linux.go:190: exec 用户进程导致“没有这样的文件或目录”的重复 - Docker,因为我没有带有 CR 行结尾的入口点 shell 脚本。该网站上的其他一些人建议CGO_ENABLED=0在编译时进行设置,但我当然不能这样做,因为这是一个 CGO 项目。
C 库安装在和/usr/local/lib/sgp4目录下,其中包含一堆 .so 文件。Linux/IFORTLinux/GFORTRAN
环境变量 LD_LIBRARY_PATH 设置为 /usr/local/lib/sgp4/Linux/IFORT。
在我的项目中,有一组包装器.h文件,CGO注释如下:
我的 Dockerfile 如下:
FROM [redacted]/alpine-base:3.17
RUN apk update && \
apk add curl jq
COPY etc/cfg/propagator.properties /usr/local/[redacted]/etc/cfg/
COPY bin/sgp4 /usr/local/[redacted]/bin/sgp4
COPY propagator/wrappers /usr/local/[redacted]/bin/wrappers
# Download library files
RUN mkdir -p /usr/local/sgp4/lib
RUN curl --output /usr/local/sgp4/lib/SGP4.tar [redacted]/SGP4.tar
RUN tar -xf /usr/local/sgp4/lib/SGP4.tar -C /usr/local/sgp4/lib
RUN rm /usr/local/sgp4/lib/SGP4.tar
RUN export LD_LIBRARY_PATH=/usr/local/sgp4/lib/Linux/IFORT
RUN chmod a+rx /usr/local/[redacted]/bin/sgp4
RUN addgroup [redacted] && adduser -D -H -G [redacted] [redacted]
USER [redacted]:[redacted]
HEALTHCHECK NONE
ENTRYPOINT ["/usr/local/[redacted]/bin/sgp4", "-config-file-path=/usr/local/[redacted]/etc/cfg/propagator.properties"]
Run Code Online (Sandbox Code Playgroud)
想知道我的库文件是否包含 CR 行结尾,我尝试将这些命令添加到我的 Dockerfile 中,但没有成功:
RUN for filey in $(find /usr/local/sgp4/lib/Linux -type f); do echo $filey; sed -i 's/\r$//g' $filey; done
Run Code Online (Sandbox Code Playgroud)
RUN for filey in $(find /usr/local/sgp4/lib/Linux -type f); do echo $filey; tr -d \r < $filey > tmp.so; mv tmp.so $filey; done
Run Code Online (Sandbox Code Playgroud)
注意:我在 debian 上编译了二进制文件,但仅限于使用 Alpine 作为 Docker 镜像。这里讨论我在编译时遇到的问题:cgo编译器错误,缺少库链接,librt.so.1找不到
解决运行时问题的一种方法是切换到基于 glibc 的 Docker 映像,例如 Debian slim 或jeanblanchard/docker-alpine-glibc,因为您的 Go 二进制文件及其 CGO 依赖项是针对 glibc 构建的。
使用jeanblanchard/alpine-glibc,因为它仍然基于 Alpine:
FROM jeanblanchard/alpine-glibc:3.18
RUN apk update && \
apk add curl jq
COPY etc/cfg/propagator.properties /usr/local/[redacted]/etc/cfg/
COPY bin/sgp4 /usr/local/[redacted]/bin/sgp4
COPY propagator/wrappers /usr/local/[redacted]/bin/wrappers
# Download library files
RUN mkdir -p /usr/local/sgp4/lib
RUN curl --output /usr/local/sgp4/lib/SGP4.tar [redacted]/SGP4.tar
RUN tar -xf /usr/local/sgp4/lib/SGP4.tar -C /usr/local/sgp4/lib
RUN rm /usr/local/sgp4/lib/SGP4.tar
ENV LD_LIBRARY_PATH=/usr/local/sgp4/lib/Linux/IFORT
RUN chmod a+rx /usr/local/[redacted]/bin/sgp4
RUN addgroup [redacted] && adduser -D -H -G [redacted] [redacted]
USER [redacted]:[redacted]
HEALTHCHECK NONE
ENTRYPOINT ["/usr/local/[redacted]/bin/sgp4", "-config-file-path=/usr/local/[redacted]/etc/cfg/propagator.properties"]
Run Code Online (Sandbox Code Playgroud)
该基础镜像保持了 Alpine 的小占用空间,但也具有 glibc 的兼容性,这应该使其与您的 CGO 二进制文件兼容。
切换到此 Dockerfile 并重建图像应该可以解决“exec user process引起的:没有这样的文件或目录”错误,以及来自ldd.
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |