forked from DL-Mirrors/termux-docker
multistage build, remove duplicate files
* Resulting image is 2x smaller and has only 1 layer. * Move content of setup-termux.sh into Dockerfile. * No duplicated static-dns-hosts.txt.
This commit is contained in:
94
Dockerfile
94
Dockerfile
@@ -1,37 +1,91 @@
|
|||||||
FROM scratch
|
##############################################################################
|
||||||
|
# Bootstrap Termux environment.
|
||||||
|
FROM scratch AS bootstrap
|
||||||
|
|
||||||
ARG BOOTSTRAP_VERSION=2021.06.04-r1
|
ARG BOOTSTRAP_VERSION=2021.06.04-r1
|
||||||
ARG BOOTSTRAP_ARCH=i686
|
ARG BOOTSTRAP_ARCH=i686
|
||||||
ARG SYSTEM_TYPE=x86
|
ARG SYSTEM_TYPE=x86
|
||||||
|
|
||||||
|
# Docker uses /bin/sh by default, but we don't have it currently.
|
||||||
|
SHELL ["/system/bin/sh", "-c"]
|
||||||
|
ENV PATH /system/bin
|
||||||
|
|
||||||
|
# Copy libc, linker and few utilities.
|
||||||
|
COPY /system/$SYSTEM_TYPE /system
|
||||||
|
|
||||||
|
# Static DNS hosts: as our system does not have a DNS resolver, we will
|
||||||
|
# have to resolve domains manually and fill /system/etc/hosts.
|
||||||
|
COPY /static-dns-hosts.txt /system/etc/static-dns-hosts.txt
|
||||||
|
|
||||||
|
# Extract bootstrap archive and create symlinks.
|
||||||
|
ADD https://github.com/termux/termux-packages/releases/download/bootstrap-$BOOTSTRAP_VERSION/bootstrap-$BOOTSTRAP_ARCH.zip /bootstrap.zip
|
||||||
|
RUN busybox mkdir -p /data/data/com.termux/files && \
|
||||||
|
cd /data/data/com.termux/files && \
|
||||||
|
busybox mkdir ../cache ./usr ./home && \
|
||||||
|
busybox unzip -d usr /bootstrap.zip && \
|
||||||
|
busybox rm /bootstrap.zip && \
|
||||||
|
cd ./usr && \
|
||||||
|
busybox cat SYMLINKS.txt | while read -r line; do \
|
||||||
|
dest=$(echo "$line" | busybox awk -F '←' '{ print $1 }'); \
|
||||||
|
link=$(echo "$line" | busybox awk -F '←' '{ print $2 }'); \
|
||||||
|
busybox ln -s "$dest" "$link"; \
|
||||||
|
done && \
|
||||||
|
busybox rm SYMLINKS.txt && \
|
||||||
|
busybox ln -s /data/data/com.termux/files/usr /usr && \
|
||||||
|
busybox ln -s /data/data/com.termux/files/usr/bin /bin && \
|
||||||
|
busybox ln -s /data/data/com.termux/files/usr/tmp /tmp
|
||||||
|
|
||||||
|
# Set ownership and file access modes:
|
||||||
|
# * User content is owned by 1000:1000.
|
||||||
|
# * Termux file modes are set only for user.
|
||||||
|
# * Rest is owned by root and has 755/644 modes.
|
||||||
|
RUN busybox chown -Rh 0:0 /system && \
|
||||||
|
busybox chown -Rh 1000:1000 /data/data/com.termux && \
|
||||||
|
busybox chown 1000:1000 /system/etc/hosts /system/etc/static-dns-hosts.txt && \
|
||||||
|
busybox find /system -type d -exec busybox chmod 755 "{}" \; && \
|
||||||
|
busybox find /system -type f -executable -exec busybox chmod 755 "{}" \; && \
|
||||||
|
busybox find /system -type f ! -executable -exec busybox chmod 644 "{}" \; && \
|
||||||
|
busybox find /data -type d -exec busybox chmod 755 "{}" \; && \
|
||||||
|
busybox find /data/data/com.termux/files -type f -o -type d -exec busybox chmod g-rwx,o-rwx "{}" \; && \
|
||||||
|
cd /data/data/com.termux/files/usr && \
|
||||||
|
busybox find ./bin ./lib/apt ./lib/bash ./libexec -type f -exec busybox chmod 700 "{}" \;
|
||||||
|
|
||||||
|
# Use utilities from Termux and switch user to non-root.
|
||||||
|
ENV PATH /data/data/com.termux/files/usr/bin
|
||||||
|
SHELL ["/data/data/com.termux/files/usr/bin/sh", "-c"]
|
||||||
|
USER 1000:1000
|
||||||
|
|
||||||
|
# Update static DNS cache on login. Also symlink script and host list to prefix.
|
||||||
|
RUN echo "echo -e 'Updating static DNS:\n' && /system/bin/update-static-dns && echo" \
|
||||||
|
> /data/data/com.termux/files/home/.bashrc && \
|
||||||
|
ln -s /system/bin/update-static-dns /data/data/com.termux/files/usr/bin/update-static-dns && \
|
||||||
|
ln -s /system/etc/static-dns-hosts.txt /data/data/com.termux/files/usr/etc/static-dns-hosts.txt
|
||||||
|
|
||||||
|
# Update static DNS cache, install updates and cleanup.
|
||||||
|
RUN /system/bin/update-static-dns && \
|
||||||
|
apt update && \
|
||||||
|
apt upgrade -o Dpkg::Options::=--force-confnew -yq && \
|
||||||
|
rm -rf /data/data/com.termux/files/usr/var/lib/apt/* && \
|
||||||
|
rm -rf /data/data/com.termux/files/usr/var/log/apt/* && \
|
||||||
|
rm -rf /data/data/com.termux/cache/apt/*
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# Create final image.
|
||||||
|
FROM scratch
|
||||||
|
|
||||||
ENV ANDROID_DATA /data
|
ENV ANDROID_DATA /data
|
||||||
ENV ANDROID_ROOT /system
|
ENV ANDROID_ROOT /system
|
||||||
ENV HOME /data/data/com.termux/files/home
|
ENV HOME /data/data/com.termux/files/home
|
||||||
ENV LANG en_US.UTF-8
|
ENV LANG en_US.UTF-8
|
||||||
|
ENV PATH /data/data/com.termux/files/usr/bin
|
||||||
ENV PREFIX /data/data/com.termux/files/usr
|
ENV PREFIX /data/data/com.termux/files/usr
|
||||||
ENV TMPDIR /data/data/com.termux/files/usr/tmp
|
ENV TMPDIR /data/data/com.termux/files/usr/tmp
|
||||||
ENV TZ UTC
|
ENV TZ UTC
|
||||||
|
|
||||||
# Temporary set PATH to /system/bin so we will be able to
|
COPY --from=bootstrap / /
|
||||||
# bootstrap Termux environment.
|
|
||||||
ENV PATH /system/bin
|
|
||||||
SHELL ["/system/bin/sh", "-c"]
|
|
||||||
|
|
||||||
# Bootstrapping Termux environment.
|
|
||||||
ADD https://github.com/termux/termux-packages/releases/download/bootstrap-$BOOTSTRAP_VERSION/bootstrap-$BOOTSTRAP_ARCH.zip /data/data/com.termux/files/bootstrap.zip
|
|
||||||
COPY /system/$SYSTEM_TYPE /system
|
|
||||||
RUN /system/setup-termux.sh
|
|
||||||
|
|
||||||
# Switch to Termux environment.
|
|
||||||
WORKDIR /data/data/com.termux/files/home
|
WORKDIR /data/data/com.termux/files/home
|
||||||
|
SHELL ["/data/data/com.termux/files/usr/bin/sh", "-c"]
|
||||||
USER 1000:1000
|
USER 1000:1000
|
||||||
ENV PATH /data/data/com.termux/files/usr/bin
|
|
||||||
|
|
||||||
# Install package updates.
|
CMD ["/data/data/com.termux/files/usr/bin/login"]
|
||||||
RUN /system/bin/update-static-dns && \
|
|
||||||
apt update && \
|
|
||||||
yes | apt upgrade && \
|
|
||||||
rm -rf /data/data/com.termux/files/usr/var/log/apt/* && \
|
|
||||||
rm -rf /data/data/com.termux/cache/apt/*
|
|
||||||
|
|
||||||
ENTRYPOINT /data/data/com.termux/files/usr/bin/login
|
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
#!/system/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
busybox mkdir -p /data/data/com.termux/cache
|
|
||||||
cd /data/data/com.termux/files
|
|
||||||
busybox mkdir home usr
|
|
||||||
busybox unzip -d usr bootstrap.zip
|
|
||||||
busybox rm -f bootstrap.zip
|
|
||||||
|
|
||||||
# Termux bootstrap archive does not store symlinks in raw form.
|
|
||||||
# Instead, it has a SYMLINKS.txt which contains the information about
|
|
||||||
# symlink paths and their targets.
|
|
||||||
cd /data/data/com.termux/files/usr
|
|
||||||
busybox cat SYMLINKS.txt | while read -r line; do
|
|
||||||
dest=$(echo "$line" | busybox awk -F '←' '{ print $1 }')
|
|
||||||
link=$(echo "$line" | busybox awk -F '←' '{ print $2 }')
|
|
||||||
echo "Creating symlink: $link --> $dest"
|
|
||||||
busybox ln -s "$dest" "$link"
|
|
||||||
done
|
|
||||||
busybox rm -f SYMLINKS.txt
|
|
||||||
|
|
||||||
# Set generic permissions.
|
|
||||||
busybox find /data -type d -exec busybox chmod 755 "{}" \;
|
|
||||||
busybox find /data/data/com.termux/files -type d -exec busybox chmod 700 "{}" \;
|
|
||||||
busybox find /data/data/com.termux/files/usr -type f -executable -exec busybox chmod 700 "{}" \;
|
|
||||||
busybox find /data/data/com.termux/files/usr -type f ! -executable -exec busybox chmod 600 "{}" \;
|
|
||||||
busybox chown -Rh 1000:1000 /data
|
|
||||||
busybox find /system -type d -exec busybox chmod 755 "{}" \;
|
|
||||||
busybox find /system -type f -executable -exec busybox chmod 755 "{}" \;
|
|
||||||
busybox find /system -type f ! -executable -exec busybox chmod 644 "{}" \;
|
|
||||||
busybox chown -Rh 0:0 /system
|
|
||||||
|
|
||||||
# These files should be writable by normal user.
|
|
||||||
busybox chown 1000:1000 /system/etc/hosts /system/etc/static-dns-hosts.txt
|
|
||||||
|
|
||||||
# This step should be kept in sync with bootstrap archive content.
|
|
||||||
busybox find bin lib/apt lib/bash libexec -type f -exec busybox chmod 700 "{}" \;
|
|
||||||
for p in ./share/doc/util-linux/getopt/getopt-parse.bash \
|
|
||||||
./share/doc/util-linux/getopt/getopt-parse.tcsh \
|
|
||||||
./var/service/ftpd/run ./var/service/telnetd/run; do
|
|
||||||
if [ -f "$p" ]; then
|
|
||||||
busybox chmod 700 "$p"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Termux doesn't use these directories, but create them for compatibility
|
|
||||||
# when executing stuff like package tests.
|
|
||||||
busybox ln -sf /data/data/com.termux/files/usr/bin /bin
|
|
||||||
busybox ln -sf /data/data/com.termux/files/usr /usr
|
|
||||||
busybox mkdir -p -m 1777 /tmp
|
|
||||||
|
|
||||||
# Symlink static dns things into Termux prefix.
|
|
||||||
busybox ln -sf /system/bin/update-static-dns /data/data/com.termux/files/usr/bin/update-static-dns
|
|
||||||
busybox ln -sf /system/etc/static-dns-hosts.txt /data/data/com.termux/files/usr/etc/static-dns-hosts.txt
|
|
||||||
|
|
||||||
# Update static dns on shell session start.
|
|
||||||
echo "echo -e 'Updating static DNS:\n' && /system/bin/update-static-dns && echo" > /data/data/com.termux/files/home/.bashrc
|
|
||||||
|
|
||||||
# Let script delete itself.
|
|
||||||
busybox rm -f "$(busybox realpath "$0")"
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
##
|
|
||||||
## Termux Docker environment doesn't have working DNS resolver.
|
|
||||||
## This list contains domains that will be manually resolved. Result
|
|
||||||
## will be used to fill /system/etc/hosts.
|
|
||||||
##
|
|
||||||
|
|
||||||
# Termux repositories:
|
|
||||||
termux.net
|
|
||||||
termux.org
|
|
||||||
packages.termux.org
|
|
||||||
|
|
||||||
# Termux mirrors:
|
|
||||||
deb.kcubeterm.me
|
|
||||||
dl.kcubeterm.me
|
|
||||||
grimler.se
|
|
||||||
termux.mentality.rip
|
|
||||||
mirrors.bfsu.edu.cn
|
|
||||||
mirrors.tuna.tsinghua.edu.cn
|
|
||||||
mirrors.ustc.edu.cn
|
|
||||||
packages.kcubeterm.me
|
|
||||||
|
|
||||||
# Termux has mirror on IPFS.
|
|
||||||
10.via0.com
|
|
||||||
ipfs.io
|
|
||||||
k51qzi5uqu5dg9vawh923wejqffxiu9bhqlze5f508msk0h7ylpac27fdgaskx.ipns.dweb.link
|
|
||||||
|
|
||||||
# Community repositories:
|
|
||||||
its-pointless.github.io
|
|
||||||
|
|
||||||
# Github:
|
|
||||||
github.com
|
|
||||||
codeload.github.com
|
|
||||||
gist.github.com
|
|
||||||
gist.githubusercontent.com
|
|
||||||
github-releases.githubusercontent.com
|
|
||||||
raw.githubusercontent.com
|
|
||||||
|
|
||||||
# Python package manager (pip):
|
|
||||||
pypi.org
|
|
||||||
test.pypi.org
|
|
||||||
upload.pypi.org
|
|
||||||
pythonhosted.org
|
|
||||||
files.pythonhosted.org
|
|
||||||
test-files.pythonhosted.org
|
|
||||||
|
|
||||||
# Ruby package manager (gem):
|
|
||||||
rubygems.org
|
|
||||||
index.rubygems.org
|
|
||||||
|
|
||||||
# Node package manager (npm):
|
|
||||||
registry.npmjs.org
|
|
||||||
|
|
||||||
# Yarn package manager (yarn):
|
|
||||||
registry.yarnpkg.com
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
#!/system/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
busybox mkdir -p /data/data/com.termux/cache
|
|
||||||
cd /data/data/com.termux/files
|
|
||||||
busybox mkdir home usr
|
|
||||||
busybox unzip -d usr bootstrap.zip
|
|
||||||
busybox rm -f bootstrap.zip
|
|
||||||
|
|
||||||
# Termux bootstrap archive does not store symlinks in raw form.
|
|
||||||
# Instead, it has a SYMLINKS.txt which contains the information about
|
|
||||||
# symlink paths and their targets.
|
|
||||||
cd /data/data/com.termux/files/usr
|
|
||||||
busybox cat SYMLINKS.txt | while read -r line; do
|
|
||||||
dest=$(echo "$line" | busybox awk -F '←' '{ print $1 }')
|
|
||||||
link=$(echo "$line" | busybox awk -F '←' '{ print $2 }')
|
|
||||||
echo "Creating symlink: $link --> $dest"
|
|
||||||
busybox ln -s "$dest" "$link"
|
|
||||||
done
|
|
||||||
busybox rm -f SYMLINKS.txt
|
|
||||||
|
|
||||||
# Set generic permissions.
|
|
||||||
busybox find /data -type d -exec busybox chmod 755 "{}" \;
|
|
||||||
busybox find /data/data/com.termux/files -type d -exec busybox chmod 700 "{}" \;
|
|
||||||
busybox find /data/data/com.termux/files/usr -type f -executable -exec busybox chmod 700 "{}" \;
|
|
||||||
busybox find /data/data/com.termux/files/usr -type f ! -executable -exec busybox chmod 600 "{}" \;
|
|
||||||
busybox chown -Rh 1000:1000 /data
|
|
||||||
busybox find /system -type d -exec busybox chmod 755 "{}" \;
|
|
||||||
busybox find /system -type f -executable -exec busybox chmod 755 "{}" \;
|
|
||||||
busybox find /system -type f ! -executable -exec busybox chmod 644 "{}" \;
|
|
||||||
busybox chown -Rh 0:0 /system
|
|
||||||
|
|
||||||
# These files should be writable by normal user.
|
|
||||||
busybox chown 1000:1000 /system/etc/hosts /system/etc/static-dns-hosts.txt
|
|
||||||
|
|
||||||
# This step should be kept in sync with bootstrap archive content.
|
|
||||||
busybox find bin lib/apt lib/bash libexec -type f -exec busybox chmod 700 "{}" \;
|
|
||||||
for p in ./share/doc/util-linux/getopt/getopt-parse.bash \
|
|
||||||
./share/doc/util-linux/getopt/getopt-parse.tcsh \
|
|
||||||
./var/service/ftpd/run ./var/service/telnetd/run; do
|
|
||||||
if [ -f "$p" ]; then
|
|
||||||
busybox chmod 700 "$p"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Termux doesn't use these directories, but create them for compatibility
|
|
||||||
# when executing stuff like package tests.
|
|
||||||
busybox ln -sf /data/data/com.termux/files/usr/bin /bin
|
|
||||||
busybox ln -sf /data/data/com.termux/files/usr /usr
|
|
||||||
busybox mkdir -p -m 1777 /tmp
|
|
||||||
|
|
||||||
# Symlink static dns things into Termux prefix.
|
|
||||||
busybox ln -sf /system/bin/update-static-dns /data/data/com.termux/files/usr/bin/update-static-dns
|
|
||||||
busybox ln -sf /system/etc/static-dns-hosts.txt /data/data/com.termux/files/usr/etc/static-dns-hosts.txt
|
|
||||||
|
|
||||||
# Update static dns on shell session start.
|
|
||||||
echo "echo -e 'Updating static DNS:\n' && /system/bin/update-static-dns && echo" > /data/data/com.termux/files/home/.bashrc
|
|
||||||
|
|
||||||
# Let script delete itself.
|
|
||||||
busybox rm -f "$(busybox realpath "$0")"
|
|
||||||
Reference in New Issue
Block a user