【问题标题】:Dockerfile build from source in one stage and then copy and install in second stageDockerfile 在一个阶段从源代码构建,然后在第二阶段复制和安装
【发布时间】:2020-08-24 13:32:57
【问题描述】:

我是 docker 和 linux 的新手。

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

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

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

【问题讨论】:

标签: linux docker dockerfile docker-multi-stage-build


【解决方案1】:

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

但是,当您复制构建的库时,您需要安装链接到它的共享库(这里是 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 应该已经存在,您只需要重新安装用于构建库的 unixodbc 库。

这是 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

【讨论】:

    【解决方案2】:

    只回答标题中的问题:

    使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多