linux - Dockerfile 在一个阶段从源代码构建,然后在第二阶段复制和安装
问题描述
我是 docker 和 linux 的新手。
我在 Alpine 基础映像上运行,我希望使我的映像尽可能干净和轻量级。我必须在我的 Dockerfile 中构建和安装一些包,特别是这个.
我想知道是否有任何方法可以让我使用 docker 多阶段构建并在一个阶段构建 MariaDB 连接器并将文件复制到下一阶段,然后将其安装在那里。
我尝试在单独的目录中构建它并将其复制到另一台机器以查看是否可行,但我遇到了一个问题,即如果没有构建目录之外的许多文件,它就无法安装。
解决方案
如果您想在第一阶段构建您的库并在后期使用它,而不需要编译它所需的所有库和工具,您可以按照您的说法使用多阶段构建。
但是,当您复制构建的库时,您需要安装链接到它的共享库(这里是 musl 和 unixodbc)。
您可以通过运行 ldd 找到它们:
/build/mariadb-connector-odbc-3.1.4 # ldd /usr/lib/libmaodbc.so
/lib/ld-musl-x86_64.so.1 (0x7fde6847b000)
libodbcinst.so.2 => /usr/lib/libodbcinst.so.2 (0x7fde683c5000)
libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fde6847b000)
由于 musl 应该已经存在,您只需要重新安装用于构建 lib 的 unixodbc lib。
这是 Dockerfile 的一个示例:
FROM alpine AS build
# Add build dependencies
RUN apk add --no-cache alpine-sdk cmake unixodbc-dev mariadb-connector-c mariadb-connector-c-dev mariadb-static unixodbc
# Download the source code from github
ADD https://github.com/MariaDB/mariadb-connector-odbc/archive/3.1.4.tar.gz /build/mariadb-connector-odbc.tgz
# Build it
WORKDIR /build
RUN tar xzf mariadb-connector-odbc.tgz \
&& cd mariadb-connector-odbc-3.1.4 \
&& CFLAGS="$CFLAGS -I/usr/include/mysql" \
cmake \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_LIBDIR=lib \
-DBUILD_SHARED_LIBS=True \
-DCMAKE_BUILD_TYPE=None \
. \
&& make install
# Final stage
FROM alpine
# Add the dependencies for the lib
RUN apk add --no-cache unixodbc
# Copy it from the build image
COPY --from=build /usr/lib/libmaodbc.so /usr/lib/libmaodbc.so
推荐阅读
- regex - 我可以使用正则表达式、Like 运算符和/或 Instr() 在较大的字符串中查找模式的索引吗?
- laravel - 如何将 laravel 路由重定向到我使用 vue-router 在 vue 中创建的链接
- excel - 使用 Google Colab 时如何将文件写入本地驱动器?
- excel - 转换为 Excel 后的数字形式为“123.456.789”
- excel-formula - Excel公式表示时间是否在某个小时范围内
- ios - 在`ios`中使用常规图像和按钮图像有何不同?
- angular - 启用跨域请求 Spring Boot
- inno-setup - Inno Setup:如果快捷方式已经存在,请不要(重新)创建快捷方式
- javascript - 世博会位置权限立即被拒绝 iOS 模拟器
- postgresql - 使用 session.query(cls).from_statement 多次插入“on conflict ...返回*”在提交之前不会反映更改