Browse Source

Merge JoinMarket-Org/joinmarket-clientserver#669: Minimal docker support

c28bfd50d4 Add support for `--docker-install` with an example Dockerfile and some docs on how to use it. (David Parrish)

Pull request description:

  This PR allows `install.sh` to run with a `--docker-install` option which installs JoinMarket without virtualenv or sudo. By not installing with virtualenv, it makes running scripts through Docker containers more straight forward. Sudo is also unnecessary because Docker containers run as root by default.

  Also included is a minimal Dockerfile which can be used as a starting point for more Docker based JoinMarket services. Documentation is also provided explaining how to use the Dockerfile.

Top commit has no ACKs.

Tree-SHA512: 91abf5b98f1089418d7d3e2154995d690ad86df1aab1d06d5df6ab4412dbaf2addbe24b4cb504db20f251cb59550e4611c316daf505e6d61df6794b5918cd0cd
master
Kristaps Kaupe 4 years ago
parent
commit
930b2a0c3d
No known key found for this signature in database
GPG Key ID: 33E472FE870C7E5D
  1. 4
      .dockerignore
  2. 13
      Dockerfile
  3. 1
      README.md
  4. 11
      docs/INSTALL.md
  5. 94
      install.sh

4
.dockerignore

@ -0,0 +1,4 @@
.git
*.egg-info
deps
jmvenv

13
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/*

1
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).

11
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),

94
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 ${@}

Loading…
Cancel
Save