基于alpine构建python3基础镜像

1,335 阅读5分钟

使用alpine构建基础镜像包

一、Dockerfile

root@hh:/volume1/development/source/alpine_python# pwd
/volume1/development/source/alpine_python
root@hh:/volume1/development/source/alpine_python# cat Dockerfile

# 构建物打包阶段 final stage
FROM alpine:latest

LABEL maintainer="kk 2021.11.17"

# 配置apk包加速镜像
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
	&& echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
	&& apk update \
	&& apk upgrade

# 安装基础包
RUN apk add --no-cache ca-certificates \
	&& apk add tzdata \
	&& apk add bash \
	#&& apk add vim \
	&& apk add s6 \
	&& apk add wget \
	&& apk add curl \
	&& apk add openssh-client \
	&& apk add iperf3 \
	# ethtool:用于获取以太网卡的配置信息,或者修改这些配置
	&& apk add ethtool \
	# nftables:是一个 netfilter 项目,旨在替换现有的 {ip,ip6,arp,eb}tables 框架,为{ip,ip6}tables提供一个新的包过滤框架、一个新的用户空间实用程序(nft)和一个兼容层。它使用现有的钩子、链接跟踪系统、用户空间排队组件和 netfilter 日志子系统。
	&& apk add nftables \
	# busybox-extras:包含 telnet 命令
	&& apk add busybox-extras \
	&& apk add tcpdump \
	&& apk add iputils \
	&& apk add iptables \
	# iproute2:ip link、ip route、ss 等命令
	&& apk add iproute2 \
	# net-tools:ifconfig、netstat、route 等命令
	&& apk add net-tools \
	#&& apk add telnet\
	#&& apk add traceroute \
	&& apk add coreutils \
	&& apk add libc6-compat \
	&& update-ca-certificates 2>/dev/null || true \
	&& rm -rf /tmp/* \
	&& rm -rf /var/cache/apk/* \
	# 缺少/etc/nsswitch.conf 文件,导致 golang 程序在 Alpine 镜像下hosts定义的域名不生效
	&& [ ! -e /etc/nsswitch.conf ] \
	&& echo "hosts: files dns" > /etc/nsswitch.conf

# 设置 操作系统时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
	#&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
	&& echo "Asia/Shanghai" > /etc/timezone
	#&& apk del tzdata

# 设置时区变量
ENV TIME_ZONE Asia/Shanghai

# 设置 语言支持
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN:zh


# 安装 python3、升级pip、setuptools
RUN apk add --no-cache python3 \
	#&& apk add --no-cache python3-dev \
	&& python3 -m ensurepip \
	#&& rm -r /usr/lib/pyopenssh-client \
	#&& busybox-extras \thon*/ensurepip \
	&& pip3 install --default-timeout=100 --no-cache-dir --upgrade pip \
	&& pip3 install --default-timeout=100 --no-cache-dir --upgrade setuptools \
	&& if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi \
	&& if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi \
	&& rm -rf /var/cache/apk/* \
	&& rm -rf ~/.cache/pip

# 打包应用
#ENV APP_NAME=${APP_NAME}
#ENV APP_ROOT="/data/apps/"${APP_NAME}
#RUN mkdir -p $APP_ROOT
#WORKDIR $APP_ROOT

# 设置启动时预期的命令参数, 可以被 docker run 的参数覆盖掉.
#CMD ["/bin/bash"]
#CMD $APP_ROOT/$APP_NAME

二、build

root@hh:/volume1/development/source/alpine_python# docker build -t alpine_python3:v1.1 .
Sending build context to Docker daemon  4.608kB
Step 1/9 : FROM alpine:latest
 ---> 0a97eee8041e
Step 2/9 : LABEL maintainer="kk 2021.11.17"
 ---> Using cache
 ---> 91aea6fe72b6
Step 3/9 : RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories 	&& echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories 	&& apk update 	&& apk upgrade
 ---> Using cache
 ---> 0aa0bedb0325
Step 4/9 : RUN apk add --no-cache ca-certificates 	&& apk add tzdata 	&& apk add bash 	&& apk add s6 	&& apk add wget 	&& apk add curl 	&& apk add openssh-client 	&& apk add iperf3 	&& apk add ethtool 	&& apk add nftables 	&& apk add busybox-extras 	&& apk add tcpdump 	&& apk add iputils 	&& apk add iptables 	&& apk add iproute2 	&& apk add net-tools 	&& apk add coreutils 	&& apk add libc6-compat 	&& update-ca-certificates 2>/dev/null || true 	&& rm -rf /tmp/* 	&& rm -rf /var/cache/apk/* 	&& [ ! -e /etc/nsswitch.conf ] 	&& echo "hosts: files dns" > /etc/nsswitch.conf
 ---> Using cache
 ---> 24ea0f936e2e
Step 5/9 : RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 	&& echo "Asia/Shanghai" > /etc/timezone
 ---> Using cache
 ---> 707c003393e5
Step 6/9 : ENV TIME_ZONE Asia/Shanghai
 ---> Using cache
 ---> 251b305d6e62
Step 7/9 : ENV LANG=zh_CN.UTF-8
 ---> Using cache
 ---> 8c7c97505d94
Step 8/9 : ENV LANGUAGE=zh_CN:zh
 ---> Using cache
 ---> 391c8bcc6314
Step 9/9 : RUN apk add --no-cache python3 	&& python3 -m ensurepip 	&& pip3 install --default-timeout=100 --no-cache-dir --upgrade pip 	&& pip3 install --default-timeout=100 --no-cache-dir --upgrade setuptools 	&& if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi 	&& if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi 	&& rm -rf /var/cache/apk/* 	&& rm -rf ~/.cache/pip
 ---> Running in 3eec105b1b5f
fetch https://mirrors.ustc.edu.cn/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://mirrors.ustc.edu.cn/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/testing/x86_64/APKINDEX.tar.gz
(1/8) Installing expat (2.4.1-r0)
(2/8) Installing libffi (3.3-r2)
(3/8) Installing gdbm (1.19-r0)
(4/8) Installing libgcc (10.3.1_git20210424-r2)
(5/8) Installing libstdc++ (10.3.1_git20210424-r2)
(6/8) Installing mpdecimal (2.5.1-r1)
(7/8) Installing sqlite-libs (3.35.5-r0)
(8/8) Installing python3 (3.9.5-r1)
Executing busybox-1.33.1-r6.trigger
OK: 82 MiB in 71 packages
Looking in links: /tmp/tmpffwjcv_d
Processing /tmp/tmpffwjcv_d/setuptools-56.0.0-py3-none-any.whl
Processing /tmp/tmpffwjcv_d/pip-21.1.1-py3-none-any.whl
Installing collected packages: setuptools, pip
Successfully installed pip-21.1.1 setuptools-56.0.0
WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
Requirement already satisfied: pip in /usr/lib/python3.9/site-packages (21.1.1)
Collecting pip
  Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 21.1.1
    Uninstalling pip-21.1.1:
      Successfully uninstalled pip-21.1.1
Successfully installed pip-21.3.1
WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
Requirement already satisfied: setuptools in /usr/lib/python3.9/site-packages (56.0.0)
Collecting setuptools
  Downloading setuptools-59.1.1-py3-none-any.whl (951 kB)
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 56.0.0
    Uninstalling setuptools-56.0.0:
      Successfully uninstalled setuptools-56.0.0
Successfully installed setuptools-59.1.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Removing intermediate container 3eec105b1b5f
 ---> ffc6b2bf5fbb
Successfully built ffc6b2bf5fbb
Successfully tagged alpine_python3:v1.1

三、push至私有镜像源harbor

root@hh:/volume1/development/source/alpine_common# docker tag alpine_common:v1.8 192.168.50.204:33080/mynas/alpine_common:v1.8
root@hh:/volume1/development/source/alpine_common# docker push 192.168.50.204:33080/mynas/alpine_common:v1.8
The push refers to repository [192.168.50.204:33080/mynas/alpine_common]
f333dd7208c7: Pushed
6c1c59c704fa: Pushed
8947332097e9: Pushed
4e3df0a938e2: Pushed
75fe4e554f7a: Pushed
1a058d5342cc: Layer already exists
v1.8: digest: sha256:2114dac79b09437b0837419ad1aa9c83712ab5c9d8dcb6f7545c00afe8f35ce2 size: 1576
root@hh:/volume1/development/source/alpine_common#
  • 运行容器、验证镜像是否符合预期
root@hh:/volume1/development/source/npc0.26.10# docker run -it alpine_common:v1.6 bash

# -it 参数,在进入容器后 exit,会摧毁容器

四、快速验证基础镜像

root@hh:/volume1/development/source/npc0.26.10# docker images | grep alpine
192.168.50.204:33080/mynas/alpine_common     v1.8             c7174bc75a2e   5 minutes ago   92.3MB
alpine_common                                v1.8             c7174bc75a2e   5 minutes ago   92.3MB
alpine                                       latest           0a97eee8041e   4 days ago      5.6MB

root@hh:/volume1/development/source/npc0.26.10# docker build -t npc:v0.26.10_v1.10 .
Sending build context to Docker daemon  12.03MB
Step 1/5 : FROM alpine_common:v1.8
 ---> c7174bc75a2e
Step 2/5 : RUN mkdir /data/apps/npc
 ---> Running in e32259794585
Removing intermediate container e32259794585
 ---> 89d3c4eeef21
Step 3/5 : WORKDIR /data/apps/npc
 ---> Running in bb8daadd1461
Removing intermediate container bb8daadd1461
 ---> 7e885221168f
Step 4/5 : COPY . .
 ---> ecd84528c9cd
Step 5/5 : CMD ["./npc -config ${CONFIGFILE}"]
 ---> Running in 8595097f2369
Removing intermediate container 8595097f2369
 ---> 12c2a31e1438
Successfully built 12c2a31e1438
Successfully tagged npc:v0.26.10_v1.10

root@hh:/volume1/development/source/npc0.26.10# docker images | grep npc
192.168.50.204:33080/mynas/npc               v0.26.10_v1.10   12c2a31e1438   About a minute ago   104MB
npc                                          v0.26.10_v1.10   12c2a31e1438   About a minute ago   104MB
192.168.50.204:33080/mynas/npc               v0.26.10_v9      87a8432c5386   8 hours ago          17.6MB
npc                                          v0.26.10_v9      87a8432c5386   8 hours ago          17.6MB
npc                                          v0.26.10_v8      13104461ceed   8 hours ago          17.6MB
192.168.50.204:33080/mynas/npc               v0.26.10_v8      13104461ceed   8 hours ago          17.6MB

参考: