docker-compose: ERROR: for pymc-repeater 'ContainerConfig' #105

Closed
opened 2026-10-27 09:33:31 +01:00 by adam · 4 comments
Owner

Hello,

$ docker-compose --version
docker-compose version 1.29.2, build unknown

did the following steps:

  1. git clone https://github.com/pyMC-dev/pyMC_Repeater/
  2. cd pyMC_Repeater
  3. cp config.yaml config.yaml
  4. sudo bash ./setup-radio-config.sh
  5. change dockerfile from "config.yaml.example ." to "COPY config.yaml ."
  6. docker-compose up -d --force-recreate --build
    `Building pymc-repeater
    DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
    Install the buildx component to build images with BuildKit:
    https://docs.docker.com/go/buildx/

Sending build context to Docker daemon 44.89MB
Step 1/27 : FROM python:3.12-slim-bookworm
---> bb5abedd2773
Step 2/27 : ARG PACKAGE_VERSION=1.0.5
---> Using cache
---> 63a3af140463
Step 3/27 : ARG USER=repeater
---> Using cache
---> b5924333600a
Step 4/27 : ARG GROUP=repeater
---> Using cache
---> e473ef31b156
Step 5/27 : ARG PUID=15888
---> Using cache
---> 72f2bb98fdb7
Step 6/27 : ARG PGID=15888
---> Using cache
---> 8d3704a73031
Step 7/27 : ARG TARGETARCH
---> Using cache
---> 26d740a4621b
Step 8/27 : ARG YQ_VERSION=v4.40.5
---> Using cache
---> 6138dccc356e
Step 9/27 : ENV INSTALL_DIR=/opt/pymc_repeater CONFIG_DIR=/etc/pymc_repeater DATA_DIR=/var/lib/pymc_repeater HOME_DIR=/home/${USER} PATH=/home/${USER}/.local/bin:${PATH} PYTHONUNBUFFERED=1 SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYMC_REPEATER=${PACKAGE_VERSION} PUID=${PUID} PGID=${PGID}
---> Using cache
---> 72db16c88c50
Step 10/27 : RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y libffi-dev python3-rrdtool jq wget libusb-1.0-0 swig git build-essential python3-dev && rm -rf /var/lib/apt/lists/*
---> Using cache
---> 093e3819fdbc
Step 11/27 : RUN arch="${TARGETARCH:-}" && if [ -z "${arch}" ]; then arch="$(uname -m)"; fi && case "${arch}" in amd64|x86_64) YQ_BINARY="yq_linux_amd64" ;; arm64|aarch64) YQ_BINARY="yq_linux_arm64" ;; arm|armv7|armv7l) YQ_BINARY="yq_linux_arm" ;; *) echo "Unsupported architecture for yq: ${arch}" >&2; exit 1 ;; esac && wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/${YQ_BINARY}" && chmod +x /usr/local/bin/yq
---> Using cache
---> f13229328792
Step 12/27 : RUN groupadd --gid "$PGID" "$GROUP" && useradd --uid "$PUID" --gid "$PGID" --home-dir "$HOME_DIR" --create-home --shell /usr/bin/bash "$USER"
---> Using cache
---> 3e74eb88435b
Step 13/27 : RUN mkdir -p ${INSTALL_DIR} ${CONFIG_DIR} ${DATA_DIR} && chown -R "$USER":"$GROUP" ${INSTALL_DIR} ${CONFIG_DIR} ${DATA_DIR} ${HOME_DIR}
---> Using cache
---> acd475c0099e
Step 14/27 : WORKDIR ${INSTALL_DIR}
---> Using cache
---> 8370f93c8a73
Step 15/27 : COPY repeater ./repeater
---> Using cache
---> 44cfa7f8dbbc
Step 16/27 : COPY pyproject.toml .
---> Using cache
---> afd93f4b9dec
Step 17/27 : COPY config.yaml .
---> Using cache
---> 42df027445b4
Step 18/27 : COPY radio-presets.json .
---> Using cache
---> 08cf1e6ad68c
Step 19/27 : COPY radio-settings.json .
---> Using cache
---> 6338804bafcd
Step 20/27 : COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
---> Using cache
---> f7cad02bcceb
Step 21/27 : USER ${USER}
---> Using cache
---> f567275c47f5
Step 22/27 : RUN pip install --no-cache-dir .
---> Using cache
---> 79027d92aed8
Step 23/27 : USER root
---> Using cache
---> 8cf61efe08c9
Step 24/27 : RUN chmod +x /usr/local/bin/docker-entrypoint.sh
---> Using cache
---> 670ba176a42b
Step 25/27 : USER ${USER}
---> Using cache
---> e97602d66766
Step 26/27 : EXPOSE 8000
---> Using cache
---> daae39106e83
Step 27/27 : ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
---> Using cache
---> f44bc203e694
Successfully built f44bc203e694
Successfully tagged pymc_repeater_pymc-repeater:latest
Recreating 5f0c6f6de0a1_pymc-repeater ...

ERROR: for 5f0c6f6de0a1_pymc-repeater 'ContainerConfig'

ERROR: for pymc-repeater 'ContainerConfig'
Traceback (most recent call last):
File "/usr/bin/docker-compose", line 33, in
sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main
command_func()
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 203, in perform_command
handler(command, command_options)
File "/usr/lib/python3/dist-packages/compose/metrics/decorator.py", line 18, in wrapper
result = fn(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1186, in up
to_attach = up(False)
^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1166, in up
return self.project.up(
^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/project.py", line 697, in up
results, errors = parallel.parallel_execute(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute
raise error_to_reraise
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer
result = func(obj)
^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/project.py", line 679, in do
return service.execute_convergence_plan(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 579, in execute_convergence_plan
return self._execute_convergence_recreate(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 499, in _execute_convergence_recreate
containers, errors = parallel_execute(
^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute
raise error_to_reraise
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer
result = func(obj)
^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 494, in recreate
return self.recreate_container(
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 612, in recreate_container
new_container = self.create_container(
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 330, in create_container
container_options = self._get_container_create_options(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 921, in _get_container_create_options
container_options, override_options = self._build_container_volume_options(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 960, in _build_container_volume_options
binds, affinity = merge_volume_bindings(
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 1548, in merge_volume_bindings
old_volumes, old_mounts = get_container_data_volumes(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 1579, in get_container_data_volumes
container.image_config['ContainerConfig'].get('Volumes') or {}
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
KeyError: 'ContainerConfig'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 228, in partial_apport_excepthook
return apport_excepthook(binary, exc_type, exc_obj, exc_tb)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 144, in apport_excepthook
os.open(pr_filename, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o640), "wb"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '/var/crash/_usr_bin_docker-compose.1000.crash'

Original exception was:
Traceback (most recent call last):
File "/usr/bin/docker-compose", line 33, in
sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main
command_func()
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 203, in perform_command
handler(command, command_options)
File "/usr/lib/python3/dist-packages/compose/metrics/decorator.py", line 18, in wrapper
result = fn(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1186, in up
to_attach = up(False)
^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1166, in up
return self.project.up(
^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/project.py", line 697, in up
results, errors = parallel.parallel_execute(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute
raise error_to_reraise
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer
result = func(obj)
^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/project.py", line 679, in do
return service.execute_convergence_plan(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 579, in execute_convergence_plan
return self._execute_convergence_recreate(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 499, in _execute_convergence_recreate
containers, errors = parallel_execute(
^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute
raise error_to_reraise
File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer
result = func(obj)
^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 494, in recreate
return self.recreate_container(
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 612, in recreate_container
new_container = self.create_container(
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 330, in create_container
container_options = self._get_container_create_options(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 921, in _get_container_create_options
container_options, override_options = self._build_container_volume_options(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 960, in _build_container_volume_options
binds, affinity = merge_volume_bindings(
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 1548, in merge_volume_bindings
old_volumes, old_mounts = get_container_data_volumes(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/compose/service.py", line 1579, in get_container_data_volumes
container.image_config['ContainerConfig'].get('Volumes') or {}
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
KeyError: 'ContainerConfig'`

What did I wrong ?

Hello, $ docker-compose --version docker-compose version 1.29.2, build unknown did the following steps: 1. git clone https://github.com/pyMC-dev/pyMC_Repeater/ 2. cd pyMC_Repeater 3. cp config.yaml config.yaml 4. sudo bash ./setup-radio-config.sh 5. change dockerfile from "config.yaml.example ." to "COPY config.yaml ." 6. docker-compose up -d --force-recreate --build `Building pymc-repeater DEPRECATED: The legacy builder is deprecated and will be removed in a future release. Install the buildx component to build images with BuildKit: https://docs.docker.com/go/buildx/ Sending build context to Docker daemon 44.89MB Step 1/27 : FROM python:3.12-slim-bookworm ---> bb5abedd2773 Step 2/27 : ARG PACKAGE_VERSION=1.0.5 ---> Using cache ---> 63a3af140463 Step 3/27 : ARG USER=repeater ---> Using cache ---> b5924333600a Step 4/27 : ARG GROUP=repeater ---> Using cache ---> e473ef31b156 Step 5/27 : ARG PUID=15888 ---> Using cache ---> 72f2bb98fdb7 Step 6/27 : ARG PGID=15888 ---> Using cache ---> 8d3704a73031 Step 7/27 : ARG TARGETARCH ---> Using cache ---> 26d740a4621b Step 8/27 : ARG YQ_VERSION=v4.40.5 ---> Using cache ---> 6138dccc356e Step 9/27 : ENV INSTALL_DIR=/opt/pymc_repeater CONFIG_DIR=/etc/pymc_repeater DATA_DIR=/var/lib/pymc_repeater HOME_DIR=/home/${USER} PATH=/home/${USER}/.local/bin:${PATH} PYTHONUNBUFFERED=1 SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYMC_REPEATER=${PACKAGE_VERSION} PUID=${PUID} PGID=${PGID} ---> Using cache ---> 72db16c88c50 Step 10/27 : RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y libffi-dev python3-rrdtool jq wget libusb-1.0-0 swig git build-essential python3-dev && rm -rf /var/lib/apt/lists/* ---> Using cache ---> 093e3819fdbc Step 11/27 : RUN arch="${TARGETARCH:-}" && if [ -z "${arch}" ]; then arch="$(uname -m)"; fi && case "${arch}" in amd64|x86_64) YQ_BINARY="yq_linux_amd64" ;; arm64|aarch64) YQ_BINARY="yq_linux_arm64" ;; arm|armv7|armv7l) YQ_BINARY="yq_linux_arm" ;; *) echo "Unsupported architecture for yq: ${arch}" >&2; exit 1 ;; esac && wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/${YQ_BINARY}" && chmod +x /usr/local/bin/yq ---> Using cache ---> f13229328792 Step 12/27 : RUN groupadd --gid "$PGID" "$GROUP" && useradd --uid "$PUID" --gid "$PGID" --home-dir "$HOME_DIR" --create-home --shell /usr/bin/bash "$USER" ---> Using cache ---> 3e74eb88435b Step 13/27 : RUN mkdir -p ${INSTALL_DIR} ${CONFIG_DIR} ${DATA_DIR} && chown -R "$USER":"$GROUP" ${INSTALL_DIR} ${CONFIG_DIR} ${DATA_DIR} ${HOME_DIR} ---> Using cache ---> acd475c0099e Step 14/27 : WORKDIR ${INSTALL_DIR} ---> Using cache ---> 8370f93c8a73 Step 15/27 : COPY repeater ./repeater ---> Using cache ---> 44cfa7f8dbbc Step 16/27 : COPY pyproject.toml . ---> Using cache ---> afd93f4b9dec Step 17/27 : COPY config.yaml . ---> Using cache ---> 42df027445b4 Step 18/27 : COPY radio-presets.json . ---> Using cache ---> 08cf1e6ad68c Step 19/27 : COPY radio-settings.json . ---> Using cache ---> 6338804bafcd Step 20/27 : COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh ---> Using cache ---> f7cad02bcceb Step 21/27 : USER ${USER} ---> Using cache ---> f567275c47f5 Step 22/27 : RUN pip install --no-cache-dir . ---> Using cache ---> 79027d92aed8 Step 23/27 : USER root ---> Using cache ---> 8cf61efe08c9 Step 24/27 : RUN chmod +x /usr/local/bin/docker-entrypoint.sh ---> Using cache ---> 670ba176a42b Step 25/27 : USER ${USER} ---> Using cache ---> e97602d66766 Step 26/27 : EXPOSE 8000 ---> Using cache ---> daae39106e83 Step 27/27 : ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] ---> Using cache ---> f44bc203e694 Successfully built f44bc203e694 Successfully tagged pymc_repeater_pymc-repeater:latest Recreating 5f0c6f6de0a1_pymc-repeater ... ERROR: for 5f0c6f6de0a1_pymc-repeater 'ContainerConfig' ERROR: for pymc-repeater 'ContainerConfig' Traceback (most recent call last): File "/usr/bin/docker-compose", line 33, in <module> sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main command_func() File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 203, in perform_command handler(command, command_options) File "/usr/lib/python3/dist-packages/compose/metrics/decorator.py", line 18, in wrapper result = fn(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1186, in up to_attach = up(False) ^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1166, in up return self.project.up( ^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/project.py", line 697, in up results, errors = parallel.parallel_execute( ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute raise error_to_reraise File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer result = func(obj) ^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/project.py", line 679, in do return service.execute_convergence_plan( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 579, in execute_convergence_plan return self._execute_convergence_recreate( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 499, in _execute_convergence_recreate containers, errors = parallel_execute( ^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute raise error_to_reraise File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer result = func(obj) ^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 494, in recreate return self.recreate_container( ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 612, in recreate_container new_container = self.create_container( ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 330, in create_container container_options = self._get_container_create_options( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 921, in _get_container_create_options container_options, override_options = self._build_container_volume_options( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 960, in _build_container_volume_options binds, affinity = merge_volume_bindings( ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 1548, in merge_volume_bindings old_volumes, old_mounts = get_container_data_volumes( ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 1579, in get_container_data_volumes container.image_config['ContainerConfig'].get('Volumes') or {} ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^ KeyError: 'ContainerConfig' Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 228, in partial_apport_excepthook return apport_excepthook(binary, exc_type, exc_obj, exc_tb) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 144, in apport_excepthook os.open(pr_filename, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o640), "wb" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PermissionError: [Errno 13] Permission denied: '/var/crash/_usr_bin_docker-compose.1000.crash' Original exception was: Traceback (most recent call last): File "/usr/bin/docker-compose", line 33, in <module> sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main command_func() File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 203, in perform_command handler(command, command_options) File "/usr/lib/python3/dist-packages/compose/metrics/decorator.py", line 18, in wrapper result = fn(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1186, in up to_attach = up(False) ^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1166, in up return self.project.up( ^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/project.py", line 697, in up results, errors = parallel.parallel_execute( ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute raise error_to_reraise File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer result = func(obj) ^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/project.py", line 679, in do return service.execute_convergence_plan( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 579, in execute_convergence_plan return self._execute_convergence_recreate( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 499, in _execute_convergence_recreate containers, errors = parallel_execute( ^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute raise error_to_reraise File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer result = func(obj) ^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 494, in recreate return self.recreate_container( ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 612, in recreate_container new_container = self.create_container( ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 330, in create_container container_options = self._get_container_create_options( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 921, in _get_container_create_options container_options, override_options = self._build_container_volume_options( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 960, in _build_container_volume_options binds, affinity = merge_volume_bindings( ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 1548, in merge_volume_bindings old_volumes, old_mounts = get_container_data_volumes( ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/service.py", line 1579, in get_container_data_volumes container.image_config['ContainerConfig'].get('Volumes') or {} ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^ KeyError: 'ContainerConfig'` **What did I wrong ?** <!-- github-sync-id:4652151271 -->
adam closed this issue 2026-10-27 09:33:31 +01:00
Author
Owner

using newer version of docker compose: Docker Compose version v5.1.4

did the following change:

chmod 777 config.yaml

docker-compose.yml

add this: in volumes:

  - ./config.yaml:/etc/pymc_repeater/config.yaml

  # USB DEVICES (Your path may differ)
  - /dev/bus/usb/001:/dev/bus/usb/001

dockerfile:

change: FROM python:3.12-slim-bookworm to FROM python:3.13-slim-trixie

Now it runs

But modem did not be detected

Image
using newer version of docker compose: Docker Compose version v5.1.4 did the following change: chmod 777 config.yaml docker-compose.yml add this: in volumes: - ./config.yaml:/etc/pymc_repeater/config.yaml # USB DEVICES (Your path may differ) - /dev/bus/usb/001:/dev/bus/usb/001 dockerfile: change: FROM python:3.12-slim-bookworm to FROM python:3.13-slim-trixie Now it runs But modem did not be detected <img width="1853" height="707" alt="Image" src="https://github.com/user-attachments/assets/a4384c0a-9a5c-4b5f-a351-568e8f28b8ce" /> <!-- github-comment-id:4695065884 -->
Author
Owner

docker-compose.yml

    devices:
      # SPI DEVICES (Your path may differ)
      # - /dev/spidev0.0
      #- /dev/gpiochip0
      # USB DEVICES (Your path may differ)
      #- /dev/bus/usb/002:/dev/bus/usb/002
      #- /dev/bus/usb/001:/dev/bus/usb/001
      - "/dev/ttyUSB0:/dev/ttyUSB0"

/etc/udev/rules.d/99-heltec.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", GROUP="dialout", MODE="0666"

now no error with access to KISS-Modem

But in logs see many DB error issues:



2026-06-14 10:23:24,157 - Dispatcher - INFO - RX RESPONSE (1)
2026-06-14 10:23:25,515 - Dispatcher - INFO - TX 50 bytes (type=RESPONSE, route=FLOOD)
2026-06-14 10:23:25,515 - RepeaterHandler - INFO - Retransmitted packet (50 bytes, 545.8ms airtime)
2026-06-14 10:23:25,516 - SQLiteHandler - ERROR - Failed to store packet in SQLite: unable to open database file
2026-06-14 10:23:25,517 - SQLiteHandler - ERROR - Failed to get cumulative counts: unable to open database file
2026-06-14 10:23:25,520 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file
2026-06-14 10:23:25,521 - MQTTHandler - WARNING - No active broker connections for publishing to packets
2026-06-14 10:23:27,037 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file
2026-06-14 10:23:42,091 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file
2026-06-14 10:23:50,050 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:23:52,269 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file
2026-06-14 10:23:52,270 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor
2026-06-14 10:23:57,048 - SQLiteHandler - ERROR - Failed to get neighbors: unable to open database file
2026-06-14 10:24:12,088 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file
2026-06-14 10:24:19,982 - SQLiteHandler - ERROR - Failed to get airtime buckets: unable to open database file
2026-06-14 10:24:20,066 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:24:22,282 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file
2026-06-14 10:24:22,282 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor
2026-06-14 10:24:27,448 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:24:28,084 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:24:28,338 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:24:42,255 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file
2026-06-14 10:24:52,293 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file
2026-06-14 10:24:52,293 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor
2026-06-14 10:24:57,051 - SQLiteHandler - ERROR - Failed to get neighbors: unable to open database file
2026-06-14 10:24:58,372 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:25:12,096 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file
2026-06-14 10:25:22,305 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file
2026-06-14 10:25:22,307 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor
2026-06-14 10:25:27,057 - RRDToolHandler - ERROR - RRD not available: available=False, rrd_path exists=False
2026-06-14 10:25:27,057 - SQLiteHandler - ERROR - Failed to get CRC error count: unable to open database file
2026-06-14 10:25:27,058 - SQLiteHandler - ERROR - Failed to get CRC error history: unable to open database file
2026-06-14 10:25:27,058 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file
2026-06-14 10:25:28,390 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:25:42,095 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file
2026-06-14 10:25:52,318 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file
2026-06-14 10:25:52,319 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor
2026-06-14 10:25:57,050 - SQLiteHandler - ERROR - Failed to get neighbors: unable to open database file
2026-06-14 10:25:58,438 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file
2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Processing packet: 31 bytes, data: 0109984e81d86f071d84386dca1d0c9c...
2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Packet parsed successfully
2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Packet type: 00
2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Raw packet callback completed
2026-06-14 10:26:02,291 - Dispatcher - INFO - [RX DEBUG] Dispatching packet to handlers
2026-06-14 10:26:02,291 - Dispatcher - INFO - RX REQ (0)
2026-06-14 10:26:04,088 - Dispatcher - INFO - TX 32 bytes (type=REQ, route=FLOOD)
2026-06-14 10:26:04,089 - RepeaterHandler - INFO - Retransmitted packet (32 bytes, 414.7ms airtime)
2026-06-14 10:26:04,089 - SQLiteHandler - ERROR - Failed to store packet in SQLite: unable to open database file
2026-06-14 10:26:04,090 - SQLiteHandler - ERROR - Failed to get cumulative counts: unable to open database file
2026-06-14 10:26:04,090 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file
2026-06-14 10:26:04,091 - MQTTHandler - WARNING - No active broker connections for publishing to packets
2026-06-14 10:26:12,101 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file
2026-06-14 10:26:19,993 - SQLiteHandler - ERROR - Failed to get airtime buckets: unable to open database file
2026-06-14 10:26:22,328 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file
2026-06-14 10:26:22,329 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor

repeater@8e97ca31b893:/opt/pymc_repeater$ ls -la /var/lib/pymc_repeater/
total 8
drwxr-xr-x 2 root root 4096 Jun 12 19:24 .
drwxr-xr-x 1 root root 4096 Jun 12 20:11 ..

docker-compose.yml ``` devices: # SPI DEVICES (Your path may differ) # - /dev/spidev0.0 #- /dev/gpiochip0 # USB DEVICES (Your path may differ) #- /dev/bus/usb/002:/dev/bus/usb/002 #- /dev/bus/usb/001:/dev/bus/usb/001 - "/dev/ttyUSB0:/dev/ttyUSB0" ``` /etc/udev/rules.d/99-heltec.rules `SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", GROUP="dialout", MODE="0666" ` now no error with access to KISS-Modem But in logs see many DB error issues: ``` 2026-06-14 10:23:24,157 - Dispatcher - INFO - RX RESPONSE (1) 2026-06-14 10:23:25,515 - Dispatcher - INFO - TX 50 bytes (type=RESPONSE, route=FLOOD) 2026-06-14 10:23:25,515 - RepeaterHandler - INFO - Retransmitted packet (50 bytes, 545.8ms airtime) 2026-06-14 10:23:25,516 - SQLiteHandler - ERROR - Failed to store packet in SQLite: unable to open database file 2026-06-14 10:23:25,517 - SQLiteHandler - ERROR - Failed to get cumulative counts: unable to open database file 2026-06-14 10:23:25,520 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file 2026-06-14 10:23:25,521 - MQTTHandler - WARNING - No active broker connections for publishing to packets 2026-06-14 10:23:27,037 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file 2026-06-14 10:23:42,091 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file 2026-06-14 10:23:50,050 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:23:52,269 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file 2026-06-14 10:23:52,270 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor 2026-06-14 10:23:57,048 - SQLiteHandler - ERROR - Failed to get neighbors: unable to open database file 2026-06-14 10:24:12,088 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file 2026-06-14 10:24:19,982 - SQLiteHandler - ERROR - Failed to get airtime buckets: unable to open database file 2026-06-14 10:24:20,066 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:24:22,282 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file 2026-06-14 10:24:22,282 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor 2026-06-14 10:24:27,448 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:24:28,084 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:24:28,338 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:24:42,255 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file 2026-06-14 10:24:52,293 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file 2026-06-14 10:24:52,293 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor 2026-06-14 10:24:57,051 - SQLiteHandler - ERROR - Failed to get neighbors: unable to open database file 2026-06-14 10:24:58,372 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:25:12,096 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file 2026-06-14 10:25:22,305 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file 2026-06-14 10:25:22,307 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor 2026-06-14 10:25:27,057 - RRDToolHandler - ERROR - RRD not available: available=False, rrd_path exists=False 2026-06-14 10:25:27,057 - SQLiteHandler - ERROR - Failed to get CRC error count: unable to open database file 2026-06-14 10:25:27,058 - SQLiteHandler - ERROR - Failed to get CRC error history: unable to open database file 2026-06-14 10:25:27,058 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file 2026-06-14 10:25:28,390 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:25:42,095 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file 2026-06-14 10:25:52,318 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file 2026-06-14 10:25:52,319 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor 2026-06-14 10:25:57,050 - SQLiteHandler - ERROR - Failed to get neighbors: unable to open database file 2026-06-14 10:25:58,438 - SQLiteHandler - ERROR - Failed to get packet type stats from SQLite: unable to open database file 2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Processing packet: 31 bytes, data: 0109984e81d86f071d84386dca1d0c9c... 2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Packet parsed successfully 2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Packet type: 00 2026-06-14 10:26:02,290 - Dispatcher - INFO - [RX DEBUG] Raw packet callback completed 2026-06-14 10:26:02,291 - Dispatcher - INFO - [RX DEBUG] Dispatching packet to handlers 2026-06-14 10:26:02,291 - Dispatcher - INFO - RX REQ (0) 2026-06-14 10:26:04,088 - Dispatcher - INFO - TX 32 bytes (type=REQ, route=FLOOD) 2026-06-14 10:26:04,089 - RepeaterHandler - INFO - Retransmitted packet (32 bytes, 414.7ms airtime) 2026-06-14 10:26:04,089 - SQLiteHandler - ERROR - Failed to store packet in SQLite: unable to open database file 2026-06-14 10:26:04,090 - SQLiteHandler - ERROR - Failed to get cumulative counts: unable to open database file 2026-06-14 10:26:04,090 - SQLiteHandler - ERROR - Failed to get packet stats: unable to open database file 2026-06-14 10:26:04,091 - MQTTHandler - WARNING - No active broker connections for publishing to packets 2026-06-14 10:26:12,101 - SQLiteHandler - ERROR - Failed to get noise floor history: unable to open database file 2026-06-14 10:26:19,993 - SQLiteHandler - ERROR - Failed to get airtime buckets: unable to open database file 2026-06-14 10:26:22,328 - SQLiteHandler - ERROR - Failed to store noise floor in SQLite: unable to open database file 2026-06-14 10:26:22,329 - MQTTHandler - WARNING - No active broker connections for publishing to noise_floor ``` ``` repeater@8e97ca31b893:/opt/pymc_repeater$ ls -la /var/lib/pymc_repeater/ total 8 drwxr-xr-x 2 root root 4096 Jun 12 19:24 . drwxr-xr-x 1 root root 4096 Jun 12 20:11 .. ``` <!-- github-comment-id:4701461473 -->
Author
Owner

Thanks for the detailed logs. From what I'm seeing, this looks like a combination of Docker setup issues rather than a bug in Repeater itself.

A few things from the current dev branch should help:

1. Use Docker Compose v2

The KeyError: 'ContainerConfig' error is a known issue with older Python-based docker-compose (v1.29.2).

Use:

docker compose up -d

instead of:

docker-compose up -d

2. Don't modify the Dockerfile to inject config.yaml

Current Repeater builds expect configuration and data to be mounted as volumes. The compose file now defaults to named volumes:

volumes:
  - ${PYMC_CONFIG_VOLUME:-pymc-repeater-config}:/etc/pymc_repeater
  - ${PYMC_DATA_VOLUME:-pymc-repeater-data}:/var/lib/pymc_repeater

This avoids the permissions issue you ran into with /var/lib/pymc_repeater.

The SQLite errors are occurring because the container runs as the non-root repeater user, while the mounted data directory is owned by root:root, preventing the database from being created or opened.

If you prefer host bind mounts instead of named volumes, create them first and assign the correct ownership:

sudo mkdir -p /opt/pymc-repeater/config /opt/pymc-repeater/data
sudo chown -R 15888:15888 /opt/pymc-repeater/config /opt/pymc-repeater/data

Then point your .env file at those paths.

3. Map the KISS modem serial device directly

For USB KISS modems, passing through the raw USB bus is usually not sufficient. Instead, map the serial device itself.

For example:

devices:
  - /dev/ttyUSB0:/dev/ttyUSB0

Or, preferably, use the stable by-id path:

devices:
  - /dev/serial/by-id/<your-modem-id>:/dev/ttyUSB0

Also make sure the device permissions allow container access. Your udev rule looks correct:

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", GROUP="dialout", MODE="0666"

Recommended Next Steps

I'd suggest:

  1. Pull the latest dev branch.
  2. Start from the current .env.example and docker-compose.yml.
  3. Avoid modifying the Dockerfile.
  4. Use docker compose (v2), not docker-compose.
  5. Map the KISS modem as /dev/ttyUSB0 (or a stable /dev/serial/by-id/... path).
  6. Ensure the mounted config/data directories and serial device permissions are correct.

If you're still seeing issues after that, post the updated compose file and container logs and we can take another look.

Thanks for the detailed logs. From what I'm seeing, this looks like a combination of Docker setup issues rather than a bug in Repeater itself. A few things from the current `dev` branch should help: ### 1. Use Docker Compose v2 The `KeyError: 'ContainerConfig'` error is a known issue with older Python-based `docker-compose` (v1.29.2). Use: ```bash docker compose up -d ``` instead of: ```bash docker-compose up -d ``` ### 2. Don't modify the Dockerfile to inject `config.yaml` Current Repeater builds expect configuration and data to be mounted as volumes. The compose file now defaults to named volumes: ```yaml volumes: - ${PYMC_CONFIG_VOLUME:-pymc-repeater-config}:/etc/pymc_repeater - ${PYMC_DATA_VOLUME:-pymc-repeater-data}:/var/lib/pymc_repeater ``` This avoids the permissions issue you ran into with `/var/lib/pymc_repeater`. The SQLite errors are occurring because the container runs as the non-root `repeater` user, while the mounted data directory is owned by `root:root`, preventing the database from being created or opened. If you prefer host bind mounts instead of named volumes, create them first and assign the correct ownership: ```bash sudo mkdir -p /opt/pymc-repeater/config /opt/pymc-repeater/data sudo chown -R 15888:15888 /opt/pymc-repeater/config /opt/pymc-repeater/data ``` Then point your `.env` file at those paths. ### 3. Map the KISS modem serial device directly For USB KISS modems, passing through the raw USB bus is usually not sufficient. Instead, map the serial device itself. For example: ```yaml devices: - /dev/ttyUSB0:/dev/ttyUSB0 ``` Or, preferably, use the stable by-id path: ```yaml devices: - /dev/serial/by-id/<your-modem-id>:/dev/ttyUSB0 ``` Also make sure the device permissions allow container access. Your udev rule looks correct: ```udev SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", GROUP="dialout", MODE="0666" ``` ### Recommended Next Steps I'd suggest: 1. Pull the latest `dev` branch. 2. Start from the current `.env.example` and `docker-compose.yml`. 3. Avoid modifying the Dockerfile. 4. Use `docker compose` (v2), not `docker-compose`. 5. Map the KISS modem as `/dev/ttyUSB0` (or a stable `/dev/serial/by-id/...` path). 6. Ensure the mounted config/data directories and serial device permissions are correct. If you're still seeing issues after that, post the updated compose file and container logs and we can take another look. <!-- github-comment-id:4721040440 -->
Author
Owner

Tested this again against the current dev branch and published dev image:

  • Branch/revision: c2d6396
  • Image: openhop/openhop-repeater:dev
  • Docker Compose: v5.3.1
  • Storage: default named config/data volumes

I verified both a fresh start and the original failure path:

docker compose up -d
docker compose up -d --force-recreate

Both completed successfully. The container remained running, the web UI returned HTTP 200, and SQLite initialized at /var/lib/openhop_repeater/repeater.db without any unable to open database file errors. The config, data directory, and database were all owned by the expected container user (15888:15888).

The original KeyError: 'ContainerConfig' comes from the obsolete Python-based docker-compose v1.29.2 client when used with modern OCI images. It is not an error produced by Repeater itself. The supported command is now:

docker compose up -d

The current Compose configuration also uses named volumes by default, which avoids the root-owned bind-mount problem reported here. Host bind mounts are still supported, but their directories must be created and made writable by UID/GID 15888.

Based on this verification, the original issue is resolved with the current image and Docker Compose v2+. Closing as completed.

Tested this again against the current `dev` branch and published dev image: - Branch/revision: `c2d6396` - Image: `openhop/openhop-repeater:dev` - Docker Compose: v5.3.1 - Storage: default named config/data volumes I verified both a fresh start and the original failure path: ```bash docker compose up -d docker compose up -d --force-recreate ``` Both completed successfully. The container remained running, the web UI returned HTTP 200, and SQLite initialized at `/var/lib/openhop_repeater/repeater.db` without any `unable to open database file` errors. The config, data directory, and database were all owned by the expected container user (`15888:15888`). The original `KeyError: 'ContainerConfig'` comes from the obsolete Python-based `docker-compose` v1.29.2 client when used with modern OCI images. It is not an error produced by Repeater itself. The supported command is now: ```bash docker compose up -d ``` The current Compose configuration also uses named volumes by default, which avoids the root-owned bind-mount problem reported here. Host bind mounts are still supported, but their directories must be created and made writable by UID/GID `15888`. Based on this verification, the original issue is resolved with the current image and Docker Compose v2+. Closing as completed. <!-- github-comment-id:5029622724 -->
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: adam/pyMC_Repeater#105