我是docker和linux的新手。
我在Alpine基本图像上运行,我想保持图像尽可能干净轻巧。我必须在Dockerfile中构建并安装一些软件包,特别是this。
我想知道是否可以使用docker多阶段构建并在一个阶段构建MariaDB连接器,然后将文件复制到下一个阶段,然后将其安装到那里。
我试图将其构建在一个单独的目录中,然后将其复制到另一台机器上以查看是否可能,但是我遇到了一个问题,即如果没有构建目录之外的许多文件,则无法安装
答案 0 :(得分: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