Docker官方指南:在Alpine上安装Python的详细步骤

在 alpine 上安装 python 的方法在 alpine 上安装 python 的方法:

# alpine 官方

apk add python3

# docker 官方
docker pull python:3.11-alpine

# 第三方
docker run –rm frolvlad/alpine-python3 python3 -c 'print("Hello World")'

# 编译安装

要点:

  • AI 给出的 Dockerfile 也是失败的。
    root 账户下:apk add python3  # OK
  • docker 官方:指定了某个版本的 python 与指定某个版本的alpine 相匹配。
  • docker 官方方法:50MB左右。
  • ?如果想在 alpine 上使用 python,使用 docker 官方方法,意味着:alpine 的初始版本,不知道是否可以改变?或者改变之后,又会产生什么麻烦?
  • 从官方 Dockerfile 来看,比较复杂,安装还是有麻烦的。apk 与 ubuntu 一样安装简单,但小众。好处就是:文件小。
    容器版本的比较:alpine 2025 纯系统约 8MB;python:3.11-alpine 约 54MB;ubuntu 22.04  纯系统约 80MB;
  • 直接采用 python:3.11-alpine Dockerfile,可能Dockerfile的末尾需要改成? CMD ["/usr/sbin/sshd", "-D", "-e"]  ?
  • alpine 在大规模的容器应用场合具有优势,可以节省大量的内存和磁盘。但是,如果只是运行几个容器的应用场景,则未必了。另外,在小内存的服务器上,还是有好处的。
  • alpine 不只是有容器版,并且官方仓库中也是有 python3的,安装也是简单的 apk add python3 ?只不过由于是用户少,也没有找到恰好的网络资料而已?
  • 安装包的错误举例

    错误原因:

    oath-tools 和 pam-oath 在官方仓库里没有   Package index – Alpine Linux packages        

      

    # 下面的在 alpine 官方仓库里,存在:

    apk update
    apk add openssh-server-pam google-authenticator

    仓库配置:

    # 阶段1:基础系统配置
    RUN echo "https://dl-cdn.alpinelinux.org/alpine/edge/main" > /etc/apk/repositories && \
        echo "https://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
        apk update && apk add –no-cache \

    # docker 官方
    docker pull python:3.11-alpine
    
    # 第三方 
    docker run --rm frolvlad/alpine-python3 python3 -c 'print("Hello World")'
    # docker 官方
    docker pull python:3.11-alpine
    
    root@abc:~# docker images
    REPOSITORY         TAG           IMAGE ID       CREATED        SIZE
    python             3.11-alpine   eba0d3065d3c   2 weeks ago    53.8MB
    python             3.12-alpine   9a82b5a7bd4e   3 weeks ago    48.2MB
    

    官方 Dockerfile

     
    python/3.11/alpine3.21/Dockerfile at master · docker-library/python · GitHub  

    #
    # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
    #
    # PLEASE DO NOT EDIT IT DIRECTLY.
    #
    
    FROM alpine:3.21
    
    # ensure local python is preferred over distribution python
    ENV PATH /usr/local/bin:$PATH
    
    # cannot remove LANG even though https://bugs.python.org/issue19846 is fixed
    # last attempted removal of LANG broke many users:
    # https://github.com/docker-library/python/pull/570
    ENV LANG C.UTF-8
    
    # runtime dependencies
    RUN set -eux; \
    	apk add --no-cache \
    		ca-certificates \
    		tzdata \
    	;
    
    ENV GPG_KEY A035C8C19219BA821ECEA86B64E628F8D684696D
    ENV PYTHON_VERSION 3.11.12
    ENV PYTHON_SHA256 849da87af4df137710c1796e276a955f7a85c9f971081067c8f565d15c352a09
    
    RUN set -eux; \
    	\
    	apk add --no-cache --virtual .build-deps \
    		gnupg \
    		tar \
    		xz \
    		\
    		bluez-dev \
    		bzip2-dev \
    		dpkg-dev dpkg \
    		findutils \
    		gcc \
    		gdbm-dev \
    		libc-dev \
    		libffi-dev \
    		libnsl-dev \
    		libtirpc-dev \
    		linux-headers \
    		make \
    		ncurses-dev \
    		openssl-dev \
    		pax-utils \
    		readline-dev \
    		sqlite-dev \
    		tcl-dev \
    		tk \
    		tk-dev \
    		util-linux-dev \
    		xz-dev \
    		zlib-dev \
    	; \
    	\
    	wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; \
    	echo "$PYTHON_SHA256 *python.tar.xz" | sha256sum -c -; \
    	wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; \
    	GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \
    	gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; \
    	gpg --batch --verify python.tar.xz.asc python.tar.xz; \
    	gpgconf --kill all; \
    	rm -rf "$GNUPGHOME" python.tar.xz.asc; \
    	mkdir -p /usr/src/python; \
    	tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; \
    	rm python.tar.xz; \
    	\
    	cd /usr/src/python; \
    	gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
    	./configure \
    		--build="$gnuArch" \
    		--enable-loadable-sqlite-extensions \
    		--enable-option-checking=fatal \
    		--enable-shared \
    		--with-lto \
    		--with-ensurepip \
    	; \
    	nproc="$(nproc)"; \
    # set thread stack size to 1MB so we don't segfault before we hit sys.getrecursionlimit()
    # https://github.com/alpinelinux/aports/commit/2026e1259422d4e0cf92391ca2d3844356c649d0
    	EXTRA_CFLAGS="-DTHREAD_STACK_SIZE=0x100000"; \
    	LDFLAGS="${LDFLAGS:--Wl},--strip-all"; \
    	make -j "$nproc" \
    		"EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \
    		"LDFLAGS=${LDFLAGS:-}" \
    	; \
    # https://github.com/docker-library/python/issues/784
    # prevent accidental usage of a system installed libpython of the same version
    	rm python; \
    	make -j "$nproc" \
    		"EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \
    		"LDFLAGS=${LDFLAGS:--Wl},-rpath='\$\$ORIGIN/../lib'" \
    		python \
    	; \
    	make install; \
    	\
    	cd /; \
    	rm -rf /usr/src/python; \
    	\
    	find /usr/local -depth \
    		\( \
    			\( -type d -a \( -name test -o -name tests -o -name idle_test \) \) \
    			-o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \
    		\) -exec rm -rf '{}' + \
    	; \
    	\
    	find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec scanelf --needed --nobanner --format '%n#p' '{}' ';' \
    		| tr ',' '\n' \
    		| sort -u \
    		| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    		| xargs -rt apk add --no-network --virtual .python-rundeps \
    	; \
    	apk del --no-network .build-deps; \
    	\
    	export PYTHONDONTWRITEBYTECODE=1; \
    	python3 --version; \
    	\
    	pip3 install \
    		--disable-pip-version-check \
    		--no-cache-dir \
    		--no-compile \
    		'setuptools==65.5.1' \
    		# https://github.com/docker-library/python/issues/1023
    		'wheel<0.46' \
    	; \
    	pip3 --version
    
    # make some useful symlinks that are expected to exist ("/usr/local/bin/python" and friends)
    RUN set -eux; \
    	for src in idle3 pip3 pydoc3 python3 python3-config; do \
    		dst="$(echo "$src" | tr -d 3)"; \
    		[ -s "/usr/local/bin/$src" ]; \
    		[ ! -e "/usr/local/bin/$dst" ]; \
    		ln -svT "$src" "/usr/local/bin/$dst"; \
    	done
    
    CMD ["python3"]

    作者:ken2232

    物联沃分享整理
    物联沃-IOTWORD物联网 » Docker官方指南:在Alpine上安装Python的详细步骤

    发表回复