linux - Dockerfile在一个阶段从源代码构建,然后在第二阶段复制并安装

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

我是docker和linux的新手。

我在Alpine基本图片上运行,我想保持图片尽可能干净轻巧。我必须在Dockerfile中构建并安装一些软件包,特别是this

我想知道是否可以使用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应该已经存在,所以您只需要安装回用于构建库的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

关于linux - Dockerfile在一个阶段从源代码构建,然后在第二阶段复制并安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61688543/

相关文章:

docker - docker 注册表ping 404

node.js - docker构建Dockerfile时如何缓存RUN npm install指令

java - docker-compose:容器之间没有连接

docker - 我在哪里放置 Docker 文件?

linux - 这个 ksh 代码是如何工作的?

linux - 无法在 CentOS 上将 Nexus 配置为服务

mysql - 插件 caching_sha2_password 无法加载 :/mariadb19/plugin/caching_sha2_password. 所以:无法打开共享对象文件

c++ - 如何在我的 Linux 主机上安装 Raspberry Pi 交叉编译器?

linux - 如何验证传递的参数、值以及参数之间的依赖关系?

docker - plesk 上 docker 中的 Neo4j(3.4.17、3.5.13、4.0.0)不使用/ssl 中提供的 SSL 证书,而是尝试删除它们并进行自己的自签名