[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