autodetect when running inside docker and provide hints

This commit is contained in:
Nick Sweeting 2020-08-10 14:15:53 -04:00
parent f24cb3dcbe
commit 33ab7fd4ec
5 changed files with 33 additions and 15 deletions

View file

@ -71,11 +71,12 @@ RUN python -m venv --clear --symlinks "$VENV_PATH" \
VOLUME "$DATA_PATH" VOLUME "$DATA_PATH"
WORKDIR "$DATA_PATH" WORKDIR "$DATA_PATH"
EXPOSE 8000 EXPOSE 8000
ENV CHROME_BINARY=google-chrome \ ENV IN_DOCKER=True \
CHROME_BINARY=google-chrome \
CHROME_SANDBOX=False \ CHROME_SANDBOX=False \
SINGLEFILE_BINARY="$EXTRA_PATH/SingleFile-master/cli/single-file" SINGLEFILE_BINARY="$EXTRA_PATH/SingleFile-master/cli/single-file"
RUN env ALLOW_ROOT=True archivebox version RUN env ALLOW_ROOT=True archivebox version
ENTRYPOINT ["dumb-init", "--", "/app/bin/docker_entrypoint.sh", "archivebox"] ENTRYPOINT ["dumb-init", "--", "/app/bin/docker_entrypoint.sh"]
CMD ["server", "0.0.0.0:8000"] CMD ["archivebox", "server", "0.0.0.0:8000"]

View file

@ -45,6 +45,7 @@ CONFIG_DEFAULTS: Dict[str, ConfigDefaultDict] = {
'IS_TTY': {'type': bool, 'default': lambda _: sys.stdout.isatty()}, 'IS_TTY': {'type': bool, 'default': lambda _: sys.stdout.isatty()},
'USE_COLOR': {'type': bool, 'default': lambda c: c['IS_TTY']}, 'USE_COLOR': {'type': bool, 'default': lambda c: c['IS_TTY']},
'SHOW_PROGRESS': {'type': bool, 'default': lambda c: c['IS_TTY']}, 'SHOW_PROGRESS': {'type': bool, 'default': lambda c: c['IS_TTY']},
'IN_DOCKER': {'type': bool, 'default': False},
# TODO: 'SHOW_HINTS': {'type: bool, 'default': True}, # TODO: 'SHOW_HINTS': {'type: bool, 'default': True},
}, },

View file

@ -29,6 +29,7 @@ class ConfigDict(BaseConfig, total=False):
IS_TTY: bool IS_TTY: bool
USE_COLOR: bool USE_COLOR: bool
SHOW_PROGRESS: bool SHOW_PROGRESS: bool
IN_DOCKER: bool
OUTPUT_DIR: str OUTPUT_DIR: str
CONFIG_FILE: str CONFIG_FILE: str

View file

@ -57,7 +57,8 @@ from .config import (
stderr, stderr,
ConfigDict, ConfigDict,
ANSI, ANSI,
# IS_TTY, IS_TTY,
IN_DOCKER,
USER, USER,
ARCHIVEBOX_BINARY, ARCHIVEBOX_BINARY,
ONLY_NEW, ONLY_NEW,
@ -178,6 +179,10 @@ def help(out_dir: str=OUTPUT_DIR) -> None:
else: else:
print('{green}Welcome to ArchiveBox v{}!{reset}'.format(VERSION, **ANSI)) print('{green}Welcome to ArchiveBox v{}!{reset}'.format(VERSION, **ANSI))
print() print()
if IN_DOCKER:
print('When using Docker, you need to mount a volume to use as your data dir:')
print(' docker run -v /some/path:/data archivebox ...')
print()
print('To import an existing archive (from a previous version of ArchiveBox):') print('To import an existing archive (from a previous version of ArchiveBox):')
print(' 1. cd into your data dir OUTPUT_DIR (usually ArchiveBox/output) and run:') print(' 1. cd into your data dir OUTPUT_DIR (usually ArchiveBox/output) and run:')
print(' 2. archivebox init') print(' 2. archivebox init')
@ -186,9 +191,6 @@ def help(out_dir: str=OUTPUT_DIR) -> None:
print(' 1. Create an empty directory, then cd into it and run:') print(' 1. Create an empty directory, then cd into it and run:')
print(' 2. archivebox init') print(' 2. archivebox init')
print() print()
print('If using Docker, you need to mount a volume to use as your data dir:')
print(' docker run -v /some/path:/data archivebox ...')
print()
print('For more information, see the documentation here:') print('For more information, see the documentation here:')
print(' https://github.com/pirate/ArchiveBox/wiki') print(' https://github.com/pirate/ArchiveBox/wiki')
@ -1060,10 +1062,14 @@ def manage(args: Optional[List[str]]=None, out_dir: str=OUTPUT_DIR) -> None:
"""Run an ArchiveBox Django management command""" """Run an ArchiveBox Django management command"""
check_data_folder(out_dir=out_dir) check_data_folder(out_dir=out_dir)
setup_django(out_dir) setup_django(out_dir)
from django.core.management import execute_from_command_line from django.core.management import execute_from_command_line
if (args and "createsuperuser" in args) and (IN_DOCKER and not IS_TTY):
stderr('[!] Warning: you need to pass -it to use interactive commands in docker', color='lightyellow')
stderr(' docker run -it archivebox manage {}'.format(' '.join(args or ['...'])), color='lightyellow')
stderr()
execute_from_command_line([f'{ARCHIVEBOX_BINARY} manage', *(args or ['help'])]) execute_from_command_line([f'{ARCHIVEBOX_BINARY} manage', *(args or ['help'])])

View file

@ -1,7 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
COMMAND="$*"
# Autodetect UID,GID of host user based on ownership of files in the data volume # Autodetect UID,GID of host user based on ownership of files in the data volume
DATA_DIR="${DATA_DIR:-/data}" DATA_DIR="${DATA_DIR:-/data}"
ARCHIVEBOX_USER="${ARCHIVEBOX_USER:-archivebox}" ARCHIVEBOX_USER="${ARCHIVEBOX_USER:-archivebox}"
@ -18,8 +16,19 @@ if [[ "$USID" != 0 && "$GRID" != 0 ]]; then
chown "$USID":"$GRID" "$DATA_DIR/*" > /dev/null 2>&1 || true chown "$USID":"$GRID" "$DATA_DIR/*" > /dev/null 2>&1 || true
fi fi
# run django as the new archivebox user # Run commands as the new archivebox user in Docker.
# any files touched will have the same uid,gid # Any files touched will have the same uid & gid
# inside docker and outside docker on the host # inside Docker and outside on the host machine.
gosu "$ARCHIVEBOX_USER" bash -c "$COMMAND" if [[ "$1" == /* || "$1" == "echo" || "$1" == "archivebox" ]]; then
# e.g. "archivebox server" # arg 1 is a binary, execute it verbatim
# e.g. "archivebox init"
# "/bin/bash"
# "echo"
gosu "$ARCHIVEBOX_USER" bash -c "$*"
else
# no command given, assume args were meant to be passed to archivebox cmd
# e.g. "add https://example.com"
# "manage createsupseruser"
# "server 0.0.0.0:8000"
gosu "$ARCHIVEBOX_USER" bash -c "archivebox $*"
fi