diff --git a/docker/.dockerignore b/docker/.dockerignore new file mode 100644 index 0000000..ba64707 --- /dev/null +++ b/docker/.dockerignore @@ -0,0 +1,2 @@ +input/ +output/ diff --git a/docker/Dockerfile b/docker/Dockerfile index 2d56f2b..b1dcc5f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,6 +2,7 @@ FROM ubuntu:18.04 ARG MENDER_ARTIFACT_VERSION=2.3.0 ARG MENDER_CONVERT_VERSION=1.0.0 +ARG GOLANG_VERSION=1.11.2 RUN apt-get update && apt-get install -y \ kpartx \ @@ -46,7 +47,15 @@ RUN wget -nc -q http://releases.linaro.org/components/toolchain/binaries/6.3-201 RUN wget -q -O /usr/bin/mender-artifact https://d1b0l86ne08fsf.cloudfront.net/mender-artifact/$MENDER_ARTIFACT_VERSION/mender-artifact \ && chmod +x /usr/bin/mender-artifact +# Golang environment, for cross-compiling the Mender client +RUN wget https://dl.google.com/go/go$GOLANG_VERSION.linux-amd64.tar.gz \ + && tar -C /usr/local -xzf go$GOLANG_VERSION.linux-amd64.tar.gz \ + && echo export PATH=$PATH:/usr/local/go/bin >> /root/.bashrc # TODO: support selecting tag of mender-convert with MENDER_CONVERT_VERSION # TODO: consider lighter way to download to avoid git dependency RUN git clone https://github.com/mendersoftware/mender-convert.git + + +COPY docker-entrypoint.sh /usr/local/bin/ +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] diff --git a/docker/README.md b/docker/README.md index 1071a34..4002566 100644 --- a/docker/README.md +++ b/docker/README.md @@ -7,7 +7,7 @@ and their version and name vary between Linux distributions. To make using mender-convert easier, a reference setup using a Ubuntu 18.04 Docker container is provided. -You need to [install Docker Engine CE](https://docs.docker.com/install) to use this environment. +You need to [install Docker Engine](https://docs.docker.com/install) to use this environment. ## Build the mender-convert container image @@ -18,7 +18,7 @@ copy this directory to your workstation and change the current directory to it. Then run ```bash -./build.sh +./docker-build ``` This will create a container image you can use to run mender-convert. @@ -26,52 +26,44 @@ This will create a container image you can use to run mender-convert. ## Use the mender-convert container image -Create a directory `input` under the directory where you copied these files (`build.sh`, `run.sh`, etc.): +Create a directory `input` under the directory where you copied these files (`docker-build`, `docker-mender-convert`, etc.): ```bash mkdir input ``` -Put your raw disk image into `input`, e.g. `input/2018-10-09-raspbian-stretch.img`. -Then put a Mender client binary compiled for your device into `input/mender-1.6.0-arm-linux-gnueabihf-gcc`. -See [the Mender documentation on how to cross-compile the Mender client for your device](https://docs.mender.io/development/client-configuration/cross-compiling). - -After you have built or pulled the mender-convert container image, -you can run it with +Then put your raw disk image into `input`, e.g. ```bash -./run.sh +mv ~/Downloads/2018-11-13-raspbian-stretch.img input/2018-11-13-raspbian-stretch.img ``` -This will drop you into a shell environment (interactive mode). -Change to the mender-convert directory: +You can run mender-convert from inside the container with your desired options, e.g. -```bash -cd /mender-convert -``` - -You can now run mender-convert with your desired options, e.g. ```bash DEVICE_TYPE="raspberrypi3" -RAW_DISK_IMAGE="input/2018-10-09-raspbian-stretch.img" -MENDER_CLIENT="input/mender-1.6.0-arm-linux-gnueabihf-gcc" +RAW_DISK_IMAGE="input/2018-11-13-raspbian-stretch.img" -ARTIFACT_NAME="2018-10-09-raspbian-stretch" -MENDER_DISK_IMAGE="2018-10-09-raspbian-stretch.sdimg" +ARTIFACT_NAME="2018-11-13-raspbian-stretch" +MENDER_DISK_IMAGE="2018-11-13-raspbian-stretch.sdimg" TENANT_TOKEN="" -./mender-convert from-raw-disk-image \ +./docker-mender-convert from-raw-disk-image \ --raw-disk-image $RAW_DISK_IMAGE \ --mender-disk-image $MENDER_DISK_IMAGE \ --device-type $DEVICE_TYPE \ - --mender-client $MENDER_CLIENT \ + --mender-client /mender \ --artifact-name $ARTIFACT_NAME \ --bootloader-toolchain arm-linux-gnueabihf \ --server-url "https://hosted.mender.io" \ --tenant-token $TENANT_TOKEN ``` +Note that the default Mender client is the latest stable and cross-compiled for generic ARM boards, +which should work well in most cases. If you would like to use a different Mender client, +place it in `inputs` and adjust the `--mender-client` argument. + Conversion will take 10-15 minutes, depending on your storage and resources available. You can watch `output/build.log` for progress and diagnostics information. @@ -79,4 +71,4 @@ After it finishes, you can find your images in the `output` directory on your ho ## Known issues -* BeagleBone images might not convert properly using this docker envirnoment due to permission issues: `mount: /mender-convert/output/embedded/rootfs: WARNING: device write-protected, mounted read-only.` \ No newline at end of file +* BeagleBone images might not convert properly using this docker envirnoment due to permission issues: `mount: /mender-convert/output/embedded/rootfs: WARNING: device write-protected, mounted read-only.` diff --git a/docker/build.sh b/docker/docker-build similarity index 100% rename from docker/build.sh rename to docker/docker-build diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh new file mode 100755 index 0000000..49bf2cd --- /dev/null +++ b/docker/docker-entrypoint.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +set -e + +MENDER_CLIENT_VERSION="1.6.0" # TODO: Default, support input as env variable + + +echo "Cross-compiling Mender client $MENDER_CLIENT_VERSION" +# NOTE: we are assuming generic ARM board here, needs to be extended later + +export PATH=$PATH:/usr/local/go/bin +export GOPATH=$HOME/go +export PATH=$PATH:/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin + +go get github.com/mendersoftware/mender +cd $GOPATH/src/github.com/mendersoftware/mender +git checkout $MENDER_CLIENT_VERSION + +env CGO_ENABLED=1 \ + CC=arm-linux-gnueabihf-gcc \ + GOOS=linux \ + GOARCH=arm make build + +cp $GOPATH/src/github.com/mendersoftware/mender/mender / + + +# run conversion, args provided to container (end of docker run ...) + +cd /mender-convert + +echo "Running mender-convert "$@"" + +./mender-convert "$@" diff --git a/docker/run.sh b/docker/docker-mender-convert similarity index 89% rename from docker/run.sh rename to docker/docker-mender-convert index a823dbc..5691b28 100755 --- a/docker/run.sh +++ b/docker/docker-mender-convert @@ -9,8 +9,8 @@ OUTPUT_DIR="$(pwd)/output" mkdir -p $OUTPUT_DIR -docker run -it \ +docker run \ --mount type=bind,source=$INPUT_DIR,target=/mender-convert/input,readonly \ --mount type=bind,source=$OUTPUT_DIR,target=/mender-convert/output \ --privileged=true \ - $IMAGE_NAME + $IMAGE_NAME "$@"