[OpenWrt-Devel] [PATCH v2] scripts: add docker-run-rootfs.sh

Paul Spooren mail at aparcar.org
Tue Apr 14 20:53:57 EDT 2020


Forgot to annotate, the v2 adds a description of the NETWORK_PREFIX to the usage
message.

On Tue, 2020-04-14 at 14:39 -1000, Paul Spooren wrote:
> The script allows to run a OpenWrt x86/64 rootfs in no time. It is
> possible to access the web interface and SSH via 192.168.1.1.
> 
> By using docker volume mounts you can easily share files/folders between
> container and host, allowing ot use hosts tools to work on files
> deployed in a running OpenWrt instance.
> 
> Additional parameters (like volumes) are passed to the `docker create`
> command, an example for this below. When quiting the container via `C-d`
> a "teardown" removes the container + created network.
> 
>     ./scripts/docker-run-rootfs.sh \
>       -v $(pwd)/package/base-files/files/bin/sysupgrade-
> online:/bin/sysupgrade-online \
>       -v $(pwd)/package/base-
> files/files/lib/upgrade/online.sh:/lib/upgrade/online.sh
> 
> Files and folders to share must be in 664 mode for "live" upgrades, see[0].
> 
> Aditionally it is possible to define "NETWORK_PREFIX" like "192.168.2"
> (without final number) to change the created network the OpenWrt
> container uses as LAN. This is to avoid network trouble (like if the
> developer uses 192.168.1.x as upstream connection) or multiple container
> should run in parralllel.
> 
> Network is disabled by default, enable it via --network or -n.
> 
> Using --prebuild or -p will download the OpenWrt image from docker hub.
> 
> [0]: 
> https://forums.docker.com/t/modify-a-file-which-mount-as-a-data-volume-but-it-didnt-change-in-container/2813/14
> 
> Signed-off-by: Paul Spooren <mail at aparcar.org>
> ---
>  scripts/docker-run-rootfs.sh | 103 +++++++++++++++++++++++++++++++++++
>  1 file changed, 103 insertions(+)
>  create mode 100644 scripts/docker-run-rootfs.sh
> 
> diff --git a/scripts/docker-run-rootfs.sh b/scripts/docker-run-rootfs.sh
> new file mode 100644
> index 0000000000..827ce37c61
> --- /dev/null
> +++ b/scripts/docker-run-rootfs.sh
> @@ -0,0 +1,103 @@
> +#!/bin/sh
> +#   Copyright (C) 2020 Paul Spooren <mail at aparcar.org>
> +
> +set -e
> +
> +SELF="$0"
> +ROOTFS_PATH="$(pwd)/bin/targets/x86/64/openwrt-x86-64-generic-rootfs.tar.gz"
> +NETWORK_ENABLE="${NETWORK_ENABLE:-0}"
> +NETWORK_PREFIX="${NETWORK_PREFIX:-192.168.1}"
> +IMAGE_NAME="openwrt-rootfs:$NETWORK_PREFIX"
> +NETWORK_NAME="none"
> +
> +die() {
> +	echo "$1"
> +	exit 1
> +}
> +
> +usage() {
> +	cat >&2 <<EOF
> +Usage: $SELF [-h|--help]
> +       $SELF
> +         [--rootfs <rootfs>]
> +         [-n|--network]
> +         [-p|--prebuild]
> +
> +<rootfs> allows to specifiy a different path for the rootfs.
> +<network> enables network access based on <NETWORK_PREFIX>
> +
> +A "NETWORK_PREFIX" like "192.168.2" (without final number) can be used to
> +change the created network the OpenWrt container uses as LAN. This is to
> avoid
> +network trouble (like if the developer uses 192.168.1.x as upstream
> connection)
> +or multiple container should run in parralllel.
> +
> +<prebuild> uses the official docker images openwrtorg/rootfs:latest
> +	-> changes to <NETWORK_PREFIX> are ignored
> +EOF
> +}
> +
> +parse_args() {
> +	while [ "$#" -gt 0 ]; do
> +		case "$1" in
> +			--rootfs) ROOTFS_PATH="$2"; shift 2 ;;
> +			--network|-n) NETWORK_ENABLE=1; shift ;;
> +			--prebuild|-p) PREBUILD=1; shift ;;
> +			--help|-h)
> +				usage
> +				exit 0
> +				;;
> +			*)
> +				DOCKER_EXTRA="$DOCKER_EXTRA $1"
> +				shift
> +				;;
> +		esac
> +	done
> +}
> +
> +parse_args "$@"
> +
> +[ -f "$ROOTFS_PATH" ] || die "Couldn't find rootfs at $ROOTFS_PATH"
> +
> +if [ -z "$PREBUILD" ]; then
> +	DOCKERFILE="$(mktemp -p $(dirname $ROOTFS_PATH))"
> +	cat <<EOT > "$DOCKERFILE"
> +	FROM scratch
> +	ADD $(basename $ROOTFS_PATH) /
> +	RUN sed 's/pi_ip="192.168.1.1/pi_ip="$NETWORK_PREFIX.1"/'
> +	RUN sed
> 's/pi_broadcast="192.168.1.255/pi_broadcast="$NETWORK_PREFIX.255"/'
> +	RUN echo "console::askfirst:/usr/libexec/login.sh" >> /etc/inittab
> +	EXPOSE 22 80 443
> +	USER root
> +	CMD ["/sbin/init"]
> +EOT
> +	docker build -t "$IMAGE_NAME" -f "$DOCKERFILE" "$(dirname $ROOTFS_PATH)"
> +	rm "$DOCKERFILE"
> +else
> +	IMAGE_NAME="openwrtorg/rootfs:latest"
> +	docker pull "$IMAGE_NAME"
> +fi
> +
> +echo "[*] Build: $ROOTFS_PATH"
> +
> +if [ "$NETWORK_ENABLE" = 1 ]; then
> +	NETWORK_NAME="openwrt-lan-$NETWORK_PREFIX"
> +	LAN_IP="$NETWORK_PREFIX.1"
> +	if [ -z "$(docker network ls | grep $NETWORK_NAME)" ]; then
> +		docker network create \
> +		  --driver=bridge \
> +		  --subnet="$NETWORK_PREFIX.0/24" \
> +		  --ip-range="$NETWORK_PREFIX.0/24" \
> +		  --gateway="$NETWORK_PREFIX.2" \
> +		  "$NETWORK_NAME"
> +		echo "[*] Created $NETWORK_NAME network "
> +	fi
> +fi
> +
> +docker run -it --rm --network="$NETWORK_NAME" --ip="$LAN_IP" \
> +	--name openwrt-docker $DOCKER_EXTRA "$IMAGE_NAME"
> +echo "[*] Created $IMAGE_NAME"
> +
> +if [ "$NETWORK_ENABLE" = 1 ]; then
> +	docker network rm "$NETWORK_NAME"
> +	echo "[*] Cleaned up network"
> +fi


_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list