我是 docker 和 linux 的新手。
我在 Alpine 基础映像上运行,我希望使我的映像尽可能干净和轻量级。我必须在我的 Dockerfile 中构建和安装一些包,特别是这个.
我想知道是否有任何方法可以让我使用 docker 多阶段构建并在一个阶段构建 MariaDB 连接器并将文件复制到下一阶段,然后将其安装在那里。
我尝试在单独的目录中构建它并将其复制到另一台机器以查看是否可行,但我遇到了一个问题,即如果没有构建目录之外的许多文件,它就无法安装。
我是 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
只回答标题中的问题:
使用 cmake 构建,您可以安装使用前缀来创建一个 psudo 包,然后将该安装目录合并到最终映像的根目录中。我不知道这是否是一个好习惯,但它似乎运作良好。
仅用于说明的简单轮廓:
build.sh
set -e # exit if error
TOP=$(pwd)
... # Fill in the blank
cmake -B./build
cd build
make -j
# Interesting part!
make DESTDIR=./install install
cp -r install "$TOP/install"
Dockerfile
FROM ubuntu:focal AS runtime-base
RUN apt-get update && apt-get install -y --no-install-recommends \
libfoo \
&& rm -rf /var/lib/apt/lists/*
#------------------------------------------------
FROM runtime-base AS build
RUN apt-get update && apt-get install -y --no-install-recommends \
libfoo-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /root
COPY build.sh
# Makes /root/install
RUN bash ./build.sh
#------------------------------------------------
FROM runtime-base
WORKDIR /root
COPY --from=build /root/install ./install
RUN cp -RT install/usr/ /usr/ && \
rm -r install && \
ldconfig