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. 58
      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 ### More installation guides
* [Installation on Windows](docs/INSTALL.md#installation-on-windows). * [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 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 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). * [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 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) #### 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), If you are a developer or you plan on modifying the code (for example to add customizations),

58
install.sh

@ -47,8 +47,12 @@ deps_install ()
'pkg-config' \ 'pkg-config' \
'libtool' \ 'libtool' \
'python3-dev' \ '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=( \ darwin_deps=( \
'automake' \ 'automake' \
@ -84,12 +88,17 @@ deb_deps_install ()
deb_deps=( ${@} ) deb_deps=( ${@} )
if deb_deps_check; then if deb_deps_check; then
clear clear
sudo_command=''
if [ "$with_sudo" == 1 ]; then
echo " echo "
sudo password required to run : sudo password required to run :
\`apt-get install ${deb_deps[@]}\` \`apt-get install ${deb_deps[@]}\`
" "
if ! sudo apt-get install ${deb_deps[@]}; then sudo_command="sudo"
fi
if ! $sudo_command apt-get install -y --no-install-recommends ${deb_deps[@]}; then
return 1 return 1
fi fi
fi fi
@ -101,12 +110,17 @@ dar_deps_install ()
if ! brew install ${dar_deps[@]}; then if ! brew install ${dar_deps[@]}; then
return 1 return 1
fi fi
sudo_command=''
if [ "$with_sudo" == 1 ]; then
echo " echo "
sudo password required to run : sudo password required to run :
\`sudo pip3 install virtualenv\` \`sudo pip3 install virtualenv\`
" "
if ! sudo pip3 install virtualenv; then sudo_command="sudo"
fi
if $with_jmvenv && ! $sudo_command pip3 install virtualenv; then
return 1 return 1
fi fi
} }
@ -316,7 +330,8 @@ joinmarket_install ()
fi fi
for req in ${reqs[@]}; do 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 done
if [[ ${with_qt} == "1" ]]; then if [[ ${with_qt} == "1" ]]; then
@ -366,6 +381,10 @@ parse_flags ()
--without-qt) --without-qt)
with_qt='0' with_qt='0'
;; ;;
--docker-install)
with_sudo='0'
with_jmvenv='0'
;;
"") "")
break break
;; ;;
@ -378,6 +397,7 @@ Options:
--develop code remains editable in place (currently always enabled) --develop code remains editable in place (currently always enabled)
--disable-os-deps-check skip OS package manager's dependency check --disable-os-deps-check skip OS package manager's dependency check
--disable-secp-check do not run libsecp256k1 tests (default is to run them) --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) --python, -p python version (only python3 versions are supported)
--with-qt build the Qt GUI --with-qt build the Qt GUI
--without-qt don't build the Qt GUI --without-qt don't build the Qt GUI
@ -432,25 +452,31 @@ install_get_os ()
main () 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 # flags
develop_build='' develop_build=''
python='python3' python='python3'
use_os_deps_check='1' use_os_deps_check='1'
use_secp_check='1' use_secp_check='1'
with_qt='' with_qt=''
with_jmvenv='1'
with_sudo='1'
reinstall='false' reinstall='false'
if ! parse_flags ${@}; then if ! parse_flags ${@}; then
return 1 return 1
fi 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 # os check
install_os="$( install_get_os )" install_os="$( install_get_os )"
@ -458,11 +484,13 @@ main ()
echo "Dependecies could not be installed. Exiting." echo "Dependecies could not be installed. Exiting."
return 1 return 1
fi fi
if [ "$with_jmvenv" == 1 ]; then
if ! venv_setup; then if ! venv_setup; then
echo "Joinmarket virtualenv could not be setup. Exiting." echo "Joinmarket virtualenv could not be setup. Exiting."
return 1 return 1
fi fi
source "${jm_root}/bin/activate" source "${jm_root}/bin/activate"
fi
mkdir -p "deps/cache" mkdir -p "deps/cache"
pushd deps pushd deps
if ! libsecp256k1_install; then if ! libsecp256k1_install; then
@ -480,9 +508,10 @@ main ()
popd popd
if ! joinmarket_install; then if ! joinmarket_install; then
echo "Joinmarket was not installed. Exiting." echo "Joinmarket was not installed. Exiting."
deactivate if [ "$with_jmvenv" == 1 ]; then deactivate; fi
return 1 return 1
fi fi
if [ "$with_jmvenv" == 1 ]; then
deactivate deactivate
echo "Joinmarket successfully installed echo "Joinmarket successfully installed
Before executing scripts or tests, run: Before executing scripts or tests, run:
@ -490,5 +519,6 @@ main ()
\`source jmvenv/bin/activate\` \`source jmvenv/bin/activate\`
from this directory, to activate virtualenv." from this directory, to activate virtualenv."
fi
} }
main ${@} main ${@}

Loading…
Cancel
Save