gcc的官方镜像,以9.2.0为例,大小达到1.14G,改成Alpine的镜像将会大大缩小构建镜像的尺寸。这篇文章介绍一下使用Alpine镜像作为基础镜像构建c或者c++环境的注意事项和最简单的方式。
Alpine镜像的限制或者前提条件
是否可以使用Alpine,大部分项目均可无视musl libc和gnu libc的区别,但是如果有相关的依赖gnu libc,则需要慎重考虑是否一定需要使用Alpine镜像,因为Alpine镜像的小巧正是建立在busybox和musl libc基础之上的,虽然在Alpine上也可以安装gnu libc,但是这种对应给人一种强烈的违和感,而且后续碰到的各种问题的概率较大。所以整体来说,如果没有一定要使用gnu libc的项目可以考虑使用Alpine镜像,否者还是不要使用较为稳妥。
版本支持
需要注意的是不同的Alpine的版本当前所支持的gcc/g++的版本有所不同,如果不是从源码编译的安装的情况下,需要注意此方面的限制,具体的查询的URL如下所示:
查询链接:https://pkgs.alpinelinux.org/
gcc版本支持
Alpine的edge版本,gcc当前支持的版本为9.2.0-r1.
而当前的3.10版本的Alpine,gcc当前最新所支持的版本为8.3.0-r0
g++版本支持
Alpine的edge版本,g++当前支持的版本为9.2.0-r1.
而当前的3.10版本的Alpine,g++当前最新所支持的版本为8.3.0-r0
在Alpine中安装gcc&g++
使用最简单的方式在Alpine中安装gcc就是使用Alpine自带的gcc或者g++版本,使用apk进行直接安装,目前在Alpine中可以通过apk进行安装的包已经超过1万个,基本上基础的生态已经逐步完善,相较于自行摸索和重复制造本来技术含量就很低的轮子,直接使用apk add可能是一个更好的选择。
安装gcc
使用如下命令可在Alpine容器中进行gcc的安装
安装当前Alpine仓库中指定版本的gcc:
apk add gcc 或者
apk add gcc=8.3.0-r0
安装g++
使用如下命令可在Alpine容器中进行g++的安装
安装当前Alpine仓库中指定版本的g++:
apk add g++ 或者
apk add g++=8.3.0-r0
安装结果确认
使用-v可以确认已安装的gcc或者g++的版本信息
/ # gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/8.3.0/lto-wrapper
Target: x86_64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-8.3.0/configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl --target=x86_64-alpine-linux-musl --with-pkgversion='Alpine 8.3.0' --enable-checking=release --disable-fixed-point --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers --enable-__cxa_atexit --enable-default-pie --enable-default-ssp --enable-cloog-backend --enable-languages=c,c++,objc,fortran,ada --disable-libssp --disable-libmpx --disable-libmudflap --disable-libsanitizer --enable-shared --enable-threads --enable-tls --with-system-zlib --with-linker-hash-style=gnu
Thread model: posix
gcc version 8.3.0 (Alpine 8.3.0)
/ #
/ # g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/8.3.0/lto-wrapper
Target: x86_64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-8.3.0/configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl --target=x86_64-alpine-linux-musl --with-pkgversion='Alpine 8.3.0' --enable-checking=release --disable-fixed-point --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers --enable-__cxa_atexit --enable-default-pie --enable-default-ssp --enable-cloog-backend --enable-languages=c,c++,objc,fortran,ada --disable-libssp --disable-libmpx --disable-libmudflap --disable-libsanitizer --enable-shared --enable-threads --enable-tls --with-system-zlib --with-linker-hash-style=gnu
Thread model: posix
gcc version 8.3.0 (Alpine 8.3.0)
/ #
最新版本的gcc支持
如果当前需要获得最新版本的gcc的支持,可以使用Alpine的edge镜像,详细示例日志如下所示:
[root@host132 ~]# docker run -it --rm alpine:edge sh
Unable to find image 'alpine:edge' locally
edge: Pulling from library/alpine
01fa3b4a8bd4: Downloading
edge: Pulling from library/alpine
01fa3b4a8bd4: Pull complete
Digest: sha256:484dfd8f6ffc7237d4d91cb107dad73f4594c33eacfd0fe77c284e36bad9303d
Status: Downloaded newer image for alpine:edge
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
v20190809-2718-gd4f71b2cd0 [http://dl-cdn.alpinelinux.org/alpine/edge/main]
v20190809-2719-g3a9792f040 [http://dl-cdn.alpinelinux.org/alpine/edge/community]
OK: 10691 distinct packages available
/ # apk add gcc
(1/10) Installing binutils (2.32-r0)
(2/10) Installing gmp (6.1.2-r1)
(3/10) Installing isl (0.18-r0)
(4/10) Installing libgomp (9.2.0-r1)
(5/10) Installing libatomic (9.2.0-r1)
(6/10) Installing libgcc (9.2.0-r1)
(7/10) Installing mpfr4 (4.0.2-r1)
(8/10) Installing mpc1 (1.1.0-r1)
(9/10) Installing libstdc++ (9.2.0-r1)
(10/10) Installing gcc (9.2.0-r1)
Executing busybox-1.31.0-r0.trigger
OK: 101 MiB in 24 packages
/ # gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/9.2.0/lto-wrapper
Target: x86_64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-9.2.0/configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl --target=x86_64-alpine-linux-musl --with-pkgversion='Alpine 9.2.0' --enable-checking=release --disable-fixed-point --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers --enable-__cxa_atexit --enable-default-pie --enable-default-ssp --enable-cloog-backend --enable-languages=c,c++,objc,fortran,ada --disable-libssp --disable-libmpx --disable-libmudflap --disable-libsanitizer --enable-shared --enable-threads --enable-tls --with-system-zlib --with-linker-hash-style=gnu
Thread model: posix
gcc version 9.2.0 (Alpine 9.2.0)
/ #
可以看到,在Alpine的edge镜像启动起来的容器中,不指定版本即可安装至目前官方镜像同等版本的支持,当然也可以稍等一阵,此版本自然会更新到稳定的Alpine版本之中。
构建Alpine镜像
使用如下示例的Dockerfile即可构建gcc的Alpine镜像
[root@host132 gcc]# cat Dockerfile.8.3.0
FROM alpine:3.10.2
ARG VERSION_GCC=8.3.0-r0
RUN apk update \
&& apk add --no-cache gcc==${VERSION_GCC} \
&& rm -rf /var/cache/apk/*
[root@host132 gcc]#
使用docker build进行构建
[root@host132 gcc]# docker build -t gcc-8.3.0 -f Dockerfile.8.3.0 .
Sending build context to Docker daemon 4.096kB
Step 1/3 : FROM alpine:3.10.2
---> 961769676411
Step 2/3 : ARG VERSION_GCC=8.3.0-r0
---> Running in 39a6fe26ccc6
Removing intermediate container 39a6fe26ccc6
---> ef463eff268b
Step 3/3 : RUN apk update && apk add --no-cache gcc==${VERSION_GCC} && rm -rf /var/cache/apk/*
---> Running in 0b831d73a0cd
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
v3.10.2-51-g21ccaac25b [http://dl-cdn.alpinelinux.org/alpine/v3.10/main]
v3.10.2-42-g95d37f7648 [http://dl-cdn.alpinelinux.org/alpine/v3.10/community]
OK: 10336 distinct packages available
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/10) Installing binutils (2.32-r0)
(2/10) Installing gmp (6.1.2-r1)
(3/10) Installing isl (0.18-r0)
(4/10) Installing libgomp (8.3.0-r0)
(5/10) Installing libatomic (8.3.0-r0)
(6/10) Installing libgcc (8.3.0-r0)
(7/10) Installing mpfr3 (3.1.5-r1)
(8/10) Installing mpc1 (1.1.0-r0)
(9/10) Installing libstdc++ (8.3.0-r0)
(10/10) Installing gcc (8.3.0-r0)
Executing busybox-1.30.1-r2.trigger
OK: 92 MiB in 24 packages
Removing intermediate container 0b831d73a0cd
---> 18643caf0beb
Successfully built 18643caf0beb
Successfully tagged gcc-8.3.0:latest
[root@host132 gcc]#
确认镜像大小
[root@host132 gcc]# docker images |grep gcc-8.3.0
gcc-8.3.0 latest 18643caf0beb 31 seconds ago 94MB
[root@host132 gcc]#
确认生成的gcc镜像中安装的gcc的版本信息
[root@host132 gcc]# docker run --rm -it gcc-8.3.0 gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alpine-linux-musl/8.3.0/lto-wrapper
Target: x86_64-alpine-linux-musl
Configured with: /home/buildozer/aports/main/gcc/src/gcc-8.3.0/configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl --target=x86_64-alpine-linux-musl --with-pkgversion='Alpine 8.3.0' --enable-checking=release --disable-fixed-point --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers --enable-__cxa_atexit --enable-default-pie --enable-default-ssp --enable-cloog-backend --enable-languages=c,c++,objc,fortran,ada --disable-libssp --disable-libmpx --disable-libmudflap --disable-libsanitizer --enable-shared --enable-threads --enable-tls --with-system-zlib --with-linker-hash-style=gnu
Thread model: posix
gcc version 8.3.0 (Alpine 8.3.0)
[root@host132 gcc]#
转载:https://blog.csdn.net/liumiaocn/article/details/100903476