Skip to content

Commit

Permalink
Merge #669: Minimal docker support
Browse files Browse the repository at this point in the history
c28bfd5 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
  • Loading branch information
kristapsk committed Feb 9, 2022
2 parents 07e198b + c28bfd5 commit 930b2a0
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 32 deletions.
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.git
*.egg-info
deps
jmvenv
13 changes: 13 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
11 changes: 11 additions & 0 deletions docs/INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
94 changes: 62 additions & 32 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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' \
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -366,6 +381,10 @@ parse_flags ()
--without-qt)
with_qt='0'
;;
--docker-install)
with_sudo='0'
with_jmvenv='0'
;;
"")
break
;;
Expand All @@ -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
Expand Down Expand Up @@ -432,37 +452,45 @@ 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 )"

if ! deps_install; then
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
Expand All @@ -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 ${@}

0 comments on commit 930b2a0

Please sign in to comment.