如何在ubuntu上构建基于alpine的类似docker图像



我正在尝试重写Dockerfile(https://github.com/orangefoil/rcssserver-docker/blob/master/Dockerfile)因此它使用alpine而不是ubuntu。目标是减小文件大小。

在原始图像中,robocup足球服务器是使用g++、flex、bison等从头开始构建的。

FROM ubuntu:18.04 AS build
ARG VERSION=16.0.0
WORKDIR /root
RUN apt update && 
apt -y install autoconf bison clang flex libboost-dev libboost-all-dev libc6-dev make wget
RUN wget https://github.com/rcsoccersim/rcssserver/archive/rcssserver-$VERSION.tar.gz && 
tar xfz rcssserver-$VERSION.tar.gz && 
cd rcssserver-rcssserver-$VERSION && 
./bootstrap && 
./configure && 
make && 
make install && 
ldconfig

我试着在高山上也这样做,不得不交换一些包裹:

FROM alpine:latest
ARG VERSION=16.0.0
WORKDIR /root
# Add basics first
RUN apk — no-cache update 
&& apk upgrade 
&& apk add autoconf bison clang-dev flex-dev boost-dev make wget automake libtool-dev g++ build-base
RUN wget https://github.com/rcsoccersim/rcssserver/archive/rcssserver-$VERSION.tar.gz
RUN tar xfz rcssserver-$VERSION.tar.gz
RUN cd rcssserver-rcssserver-$VERSION && 
./bootstrap && 
./configure && 
make && 
make install && 
ldconfig

不幸的是,我的版本还不起作用。失败

/usr/lib/gcc/x86_64-alpine-linux-musl/9.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lrcssclangparser

根据我到目前为止的发现,如果没有安装开发包(请参阅ld找不到现有的库(,但我改为可以找到它们的开发包,但仍然没有运气。

所以,我目前的假设是ubuntu已经安装了一些软件包,我需要将其添加到我的alpine图像中。我会排除一个代码问题,因为ubuntu版本是有效的。

有什么想法吗,可能缺少什么?我也很乐意了解如何自己比较包裹,但ubuntu和alpine的包裹名称不同,所以我发现很难弄清楚。

您应该使用多阶段构建来分解它。在您现在构建的映像中,最终映像包含C工具链以及这些-dev包安装的所有开发库和头文件;您不需要任何这些来实际运行构建的应用程序。基本思想是完全按照现在的方式构建应用程序,但随后COPY仅将构建的应用程序构建为具有较少依赖性的新映像。

这看起来像这样(未经测试(:

FROM ubuntu:18.04 AS build
# ... exactly what's in the original question ...
FROM ubuntu:18.04
# Install the shared libraries you need to run the application,
# but not -dev headers or the full C toolchain.  You may need to
# run `ldd` on the built binary to see what exactly it needs.
RUN apt-get update 
&& DEBIAN_FRONTEND=noninteractive 
apt-get install --assume-yes --no-install-recommends 
libboost-atomic1.65.1 
libboost-chrono1.65.1 
# ... more libboost-* libraries as required ...
# Get the built application out of the original image.
# Autoconf's default is to install into /usr/local, and in a
# typical Docker base image nothing else will be installed there.
COPY --from=build /usr/local /usr/local
RUN ldconfig
# Describe how to run a container.
EXPOSE 12345
CMD ["/usr/local/bin/rcssserver"]

与C工具链、头文件和构建时库的大小相比,Alpine和Ubuntu映像之间的差异非常小,而且Alpine在其最小的libc实现中存在大量的库兼容性问题。

最新更新