使用docker环境打包镜像

在linux系统中,经常会出现编译安装软件;然而linux发行版不同编译软件的过程也大不相同,构建出来的二进制软件也不能随意复制使用。使用docker可以很好的解决问题,并且实现一次构建多处使用。

  • dockerfile构建软件

以下使用 ZLMediaKit软件构建为案例说明 dockerfile 编译并且打包镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# 标记此处构建使用容器内构建镜像体 AS build关键词
FROM dockerpull.com/ubuntu:20.04 AS build
#shell,rtmp,rtsp,rtsps,http,https,rtp
EXPOSE 9000/tcp
EXPOSE 8000/tcp
EXPOSE 8000/udp
EXPOSE 1935/tcp
EXPOSE 554/tcp
EXPOSE 322/tcp
EXPOSE 80/tcp
EXPOSE 443/tcp
EXPOSE 10000/udp
EXPOSE 10000/tcp

# 国内Ubuntu软件仓访问速度太慢,使用华为云镜像地址加速处理
RUN sed -i 's/archive.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list
RUN sed -i 's/ports.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list

# 安装必要的软件依赖,包括构建包 gcc cmake等
RUN apt-get update && \
DEBIAN_FRONTEND="noninteractive" \
apt-get install -y --no-install-recommends \
build-essential \
cmake \
curl \
vim \
ca-certificates \
tzdata \
libssl-dev \
libmysqlclient-dev \
libx264-dev \
libfaac-dev \
libavcodec-dev \
libavutil-dev \
ffmpeg \
yasm && \
apt-get autoremove -y && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*

# 创建必要工作目录,需要注意,docker依赖包默认情况是最小化容器,需要自行创建对应的工作目录
RUN mkdir -p /opt/media/ZLMediaKit/ \
/opt/media/ZLMediaKit/release/linux/Release/ \
/usr/local/openssl \
/usr/local/openssl

WORKDIR /opt/media
COPY . /opt/media/ZLMediaKit/

WORKDIR /opt/media/ZLMediaKit/libs
RUN tar -xvf openssl-1.1.1k.tar.gz && tar -xvf libsrtp-2.3.0.tar.gz

WORKDIR /opt/media/ZLMediaKit/libs/openssl-1.1.1k/
RUN ./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl && make && make install

WORKDIR /opt/media/ZLMediaKit/libs/libsrtp-2.3.0/
RUN ./configure --enable-openssl --with-openssl-dir=/usr/local/openssl && make -j8 && make install

WORKDIR /opt/media/ZLMediaKit/build
RUN cmake .. -DENABLE_WEBRTC=true -DOPENSSL_ROOT_DIR=/usr/local/openssl -DOPENSSL_LIBRARIES=/usr/local/openssl/lib -DCMAKE_BUILD_TYPE=Release &&\
make -j4
# 这里是构建镜像真实路径
FROM dockerpull.com/ubuntu:20.04

RUN sed -i 's/archive.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list
RUN sed -i 's/ports.ubuntu.com/mirrors.huaweicloud.com/g' /etc/apt/sources.list

RUN apt-get update && \
DEBIAN_FRONTEND="noninteractive" \
apt-get install -y --no-install-recommends \
vim \
ca-certificates \
tzdata \
libssl-dev \
libx264-dev \
libfaac-dev \
ffmpeg && \
apt-get autoremove -y && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*

WORKDIR /opt/media/
# --from=build 语法表示从构建体中直接拷贝,使用构建体可以大大减小镜像层数和体积
COPY --from=build /opt/media/ZLMediaKit/release/linux/Release/MediaServer /opt/media/MediaServer
COPY --from=build /opt/media/ZLMediaKit/default.pem /opt/media/default.pem
COPY --from=build /opt/media/ZLMediaKit/conf/config.ini /opt/media/config.ini
COPY --from=build /opt/media/ZLMediaKit/release/linux/Release/www /opt/media/www
COPY --from=build /opt/media/ZLMediaKit/release/linux/Release/www /opt/media/static

CMD ["/opt/media/MediaServer","-s","/opt/media/default.pem","-c","/opt/media/config.ini"]