首页 > 解决方案 > Docker 映像中的符号链接丢失

问题描述

我正在定义一个 Dockerfile,我安装sqlite3在一个ubuntu基于图像的位置,非常相似(我还安装了 grpc 和 rust 以及所有必要的依赖项):

FROM ubuntu

RUN apt-get update && \
    apt-get install -y sqlite3 libsqlite3-dev&& \
    apt-get clean && \
    apt-get autoremove

我使用这张图片在其中构建了我的 Rust 项目。我面临的问题是cargo build我的 GitLab CI 由于链接问题而失败:

Compiling migrations_macros v1.4.0
error: linking with `cc` failed: exit code: 1
...
= note: /usr/bin/ld: cannot find -lsqlite3

我发现这是由于在 CI 上运行的 Docker 映像上不存在此符号链接:

libsqlite3.so -> /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6

当文件libsqlite3.so.0.8.6存在时。因此,如果我在 CI 作业期间创建符号链接,我可以有一个可行的解决方法。奇怪的是,如果我从我的电脑上的注册表中提取相同的确切图像并运行容器,我可以构建没有任何问题和任何更改,因为符号链接实际上存在。

问题的原因可能是什么以及如何解决?

标签: sqlitedockerrustsymlink

解决方案


经过相当多的思考后,我想到了以下想法,这可能会有所帮助。

  • 码头工人历史

Docker 命令具有内置功能,可以查看构建映像的历史记录。您可以选择在 DockerFile 中识别有问题的命令。

docker history <image id or name>

对于更多的视觉过滤,我推荐潜水工具,但其他工具也可以在谷歌上找到。

  • 正确的码头工人版本

由于在这种情况下,两个 docker 实例是不同的,所以这个问题是微不足道的。它们是否在同一版本的 docker daemon 和 docker 文件系统驱动程序上?


推荐阅读