From c28bfd50d4e9f463b9387b0c07d75349609971f9 Mon Sep 17 00:00:00 2001 From: David Parrish Date: Sun, 16 Aug 2020 20:50:44 -0400 Subject: [PATCH] Add support for `--docker-install` with an example Dockerfile and some docs on how to use it. --- .dockerignore | 4 +++ Dockerfile | 13 +++++++ README.md | 1 + docs/INSTALL.md | 11 ++++++ install.sh | 94 ++++++++++++++++++++++++++++++++----------------- 5 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..cede6cc --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.git +*.egg-info +deps +jmvenv \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9ef9481 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM debian:buster-slim + +RUN mkdir -p /jm/clientserver +WORKDIR /jm/clientserver + +COPY . . + +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates=* curl=* \ + python3-pip=* \ + && pip3 install 'wheel>=0.35.1' \ + && ./install.sh --docker-install \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* diff --git a/README.md b/README.md index cae7f98..434e97d 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Alternative to this "quickstart": follow the [install guide](docs/INSTALL.md). ### More installation guides * [Installation on Windows](docs/INSTALL.md#installation-on-windows). +* [Installation with Docker](docs/INSTALL.md#docker-installation) * [Installation guide for RaspiBlitz](https://github.com/openoms/bitcoin-tutorials/blob/master/joinmarket/README.md). * [Installation guide for RaspiBolt](https://github.com/kristapsk/raspibolt-extras/blob/master/joinmarket.md). * [Installation guide for Qubes+Whonix](https://github.com/qubenix/qubes-whonix-bitcoin/blob/master/1_joinmarket.md). diff --git a/docs/INSTALL.md b/docs/INSTALL.md index d926ee1..7aeaa1f 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -267,6 +267,17 @@ There, you need to install the client code (without Joinmarket's bitcoin): python setupall.py --client-only +#### Docker Installation + +The [Dockerfile](Dockerfile) provided builds a minimal Docker image which can help in getting started with a custom Docker setup. An example of building and running the [wallet-tool.py](scripts/wallet-tool.py) script: + +``` +docker build -t joinmarket-test ./ +docker run --rm -it joinmarket-test bash -c "cd scripts && python3 wallet-tool.py --help" +``` + +A new Docker image can be built using `joinmarket-test` as a base using `FROM joinmarket-test`. See [Docker documentation](https://docs.docker.com/engine/reference/builder/) for more details. + #### Development (or making other changes to the code) If you are a developer or you plan on modifying the code (for example to add customizations), diff --git a/install.sh b/install.sh index 669c703..c24787f 100755 --- a/install.sh +++ b/install.sh @@ -47,8 +47,12 @@ deps_install () 'pkg-config' \ 'libtool' \ 'python3-dev' \ - 'virtualenv' \ - 'python3-pip' ) + 'python3-pip' \ + 'python3-setuptools' \ + 'libltdl-dev' ) + + if [ "$with_jmvenv" == 1 ]; then debian_deps+=("virtualenv"); fi + if [ "$with_sudo" == 1 ]; then debian_deps+=("sudo"); fi darwin_deps=( \ 'automake' \ @@ -84,13 +88,18 @@ deb_deps_install () deb_deps=( ${@} ) if deb_deps_check; then clear - echo " - sudo password required to run : + sudo_command='' + if [ "$with_sudo" == 1 ]; then + echo " + sudo password required to run : + + \`apt-get install ${deb_deps[@]}\` + " + sudo_command="sudo" + fi - \`apt-get install ${deb_deps[@]}\` - " - if ! sudo apt-get install ${deb_deps[@]}; then - return 1 + if ! $sudo_command apt-get install -y --no-install-recommends ${deb_deps[@]}; then + return 1 fi fi } @@ -101,12 +110,17 @@ dar_deps_install () if ! brew install ${dar_deps[@]}; then return 1 fi - echo " - sudo password required to run : - \`sudo pip3 install virtualenv\` - " - if ! sudo pip3 install virtualenv; then + sudo_command='' + if [ "$with_sudo" == 1 ]; then + echo " + sudo password required to run : + + \`sudo pip3 install virtualenv\` + " + sudo_command="sudo" + fi + if $with_jmvenv && ! $sudo_command pip3 install virtualenv; then return 1 fi } @@ -316,7 +330,8 @@ joinmarket_install () fi for req in ${reqs[@]}; do - pip install -r "requirements/${req}" || return 1 + if [ "$with_jmvenv" == 1 ]; then pip_command=pip; else pip_command=pip3; fi + $pip_command install -r "requirements/${req}" || return 1 done if [[ ${with_qt} == "1" ]]; then @@ -366,6 +381,10 @@ parse_flags () --without-qt) with_qt='0' ;; + --docker-install) + with_sudo='0' + with_jmvenv='0' + ;; "") break ;; @@ -378,6 +397,7 @@ Options: --develop code remains editable in place (currently always enabled) --disable-os-deps-check skip OS package manager's dependency check --disable-secp-check do not run libsecp256k1 tests (default is to run them) +--docker-install system wide install as root for minimal Docker installs --python, -p python version (only python3 versions are supported) --with-qt build the Qt GUI --without-qt don't build the Qt GUI @@ -432,25 +452,31 @@ install_get_os () main () { - jm_source="$PWD" - jm_root="${jm_source}/jmvenv" - jm_deps="${jm_source}/deps" - export PKG_CONFIG_PATH="${jm_root}/lib/pkgconfig:${PKG_CONFIG_PATH}" - export LD_LIBRARY_PATH="${jm_root}/lib:${LD_LIBRARY_PATH}" - export C_INCLUDE_PATH="${jm_root}/include:${C_INCLUDE_PATH}" - export MAKEFLAGS='-j' - # flags develop_build='' python='python3' use_os_deps_check='1' use_secp_check='1' with_qt='' + with_jmvenv='1' + with_sudo='1' reinstall='false' if ! parse_flags ${@}; then return 1 fi + jm_source="$PWD" + if [ "$with_jmvenv" == 1 ]; then + jm_root="${jm_source}/jmvenv" + else + jm_root="" + fi + jm_deps="${jm_source}/deps" + export PKG_CONFIG_PATH="${jm_root}/lib/pkgconfig:${PKG_CONFIG_PATH}" + export LD_LIBRARY_PATH="${jm_root}/lib:${LD_LIBRARY_PATH}" + export C_INCLUDE_PATH="${jm_root}/include:${C_INCLUDE_PATH}" + export MAKEFLAGS='-j' + # os check install_os="$( install_get_os )" @@ -458,11 +484,13 @@ main () echo "Dependecies could not be installed. Exiting." return 1 fi - if ! venv_setup; then - echo "Joinmarket virtualenv could not be setup. Exiting." - return 1 + if [ "$with_jmvenv" == 1 ]; then + if ! venv_setup; then + echo "Joinmarket virtualenv could not be setup. Exiting." + return 1 + fi + source "${jm_root}/bin/activate" fi - source "${jm_root}/bin/activate" mkdir -p "deps/cache" pushd deps if ! libsecp256k1_install; then @@ -480,15 +508,17 @@ main () popd if ! joinmarket_install; then echo "Joinmarket was not installed. Exiting." - deactivate + if [ "$with_jmvenv" == 1 ]; then deactivate; fi return 1 fi - deactivate - echo "Joinmarket successfully installed - Before executing scripts or tests, run: + if [ "$with_jmvenv" == 1 ]; then + deactivate + echo "Joinmarket successfully installed + Before executing scripts or tests, run: - \`source jmvenv/bin/activate\` + \`source jmvenv/bin/activate\` - from this directory, to activate virtualenv." + from this directory, to activate virtualenv." + fi } main ${@}