首页 > 解决方案 > Dockerfile 在一个阶段从源代码构建,然后在第二阶段复制和安装

问题描述

我是 docker 和 linux 的新手。

我在 Alpine 基础映像上运行,我希望使我的映像尽可能干净和轻量级。我必须在我的 Dockerfile 中构建和安装一些包,特别是这个.

我想知道是否有任何方法可以让我使用 docker 多阶段构建并在一个阶段构建 MariaDB 连接器并将文件复制到下一阶段,然后将其安装在那里。

我尝试在单独的目录中构建它并将其复制到另一台机器以查看是否可行,但我遇到了一个问题,即如果没有构建目录之外的许多文件,它就无法安装。

标签: linuxdockerdockerfiledocker-multi-stage-build

解决方案


如果您想在第一阶段构建您的库并在后期使用它,而不需要编译它所需的所有库和工具,您可以按照您的说法使用多阶段构建。

但是,当您复制构建的库时,您需要安装链接到它的共享库(这里是 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

推荐阅读