Справочная информация по Python, Docker и другим штукам, которые встретились мне на тернистом пути.

Git fetch all subdirs via bash

BASH для быстро поиска и fetch всех репозиториев в текущей папке

find’ом ищем все гит репозитории и принудительно обновляем их

find . -maxdepth 4 -name .git -type d -prune | sed 's/.git//g' | xargs -I {} git -C {} fetch --all -v  --progress --prune --force

Postgres дамп и восстановление одной командой через bash pipes

Пример переноса БД через pg_dump и pg_restore

Без промежуточных файлов, одной строкой.

pg_dump -Fc -v --no-acl --dbname=postgresql://$DB_SOURCE_USERNAME:$DB_SOURCE_PASSWORD@$DB_SOURCE_HOST:$DB_SOURCE_PORT/$DB_SOURCE_NAME \
 | pg_restore -Fc -v --no-acl --no-owner --single-transaction --role=$DB_DESTINATION_USERNAME --dbname=postgresql://$DB_DESTINATION_USERNAME:$DB_DESTINATION_PASSWORD@$DB_DESTINATION_HOST:$DB_SOURCE_PORT/$DB_DESTINATION_NAME

Build python container with nonroot user and pip packages inside

Пример сборки nonroot контейнера для запуска Python проектов в Docker.

FROM python:3.12-slim

EXPOSE 8080
ARG USERNAME=nonroot
ARG UID=1005
ARG GID=1005
RUN groupadd -g "${GID}" ${USERNAME} \
  && useradd --create-home --no-log-init -u "${UID}" -g "${GID}" ${USERNAME}

USER ${USERNAME}
WORKDIR /home/${USERNAME}

# very important line
ENV PATH="$PATH:/home/${USERNAME}/.local/bin"
ENV PYTHONUNBUFFERED=1
COPY requirements.txt ./
RUN pip3 install --disable-pip-version-check --no-cache-dir -r requirements.txt
#RUN pip3 install --disable-pip-version-check --no-cache-dir django

COPY --chown=${USERNAME}:${USERNAME} app./
COPY --chown=${USERNAME}:${USERNAME}  manage.py ./

ENTRYPOINT ["gunicorn", "--bind", ":8080", "app.wsgi"]

Caddy distroless docker build

Пример сборки distroless контейнера для caddy

  FROM caddy:2.7.5-alpine AS caddy_base
  FROM gcr.io/distroless/static-debian12 as debian_nonroot
  
  EXPOSE 80/tcp 443/tcp 8080/tcp
  USER nonroot
  ENV TZ="Europe/Moscow"
  
  COPY --from=caddy_base --chown=nonroot:nonroot /usr/bin/caddy /usr/bin/caddy
  # https://caddyserver.com/docs/conventions#file-locations
  COPY --from=caddy_base --chown=nonroot:nonroot /data /data
  COPY --from=caddy_base --chown=nonroot:nonroot /config /config
  VOLUME /data
  VOLUME /config
  
  COPY --from=caddy_base --chown=nonroot:nonroot /etc/caddy/Caddyfile /etc/caddy/Caddyfile
  COPY --from=caddy_base --chown=nonroot:nonroot  /usr/share/caddy/ /usr/share/caddy/
  
  ENTRYPOINT ["caddy", "run", "--config", "/etc/caddy/Caddyfile"]

Меняем элементы в массиве json postgres sql

Пример изменения элементов в массиве postgres json

------------------------------------------------- 
with edited as ( 
 select 
 -- здесь 1337 это новое значение для sample_id
  t1.id as sample_id, 
  -- 2. замена sample_id 
  jsonb_set( t1.arr_element, '{"sample_id}', '1337', false) as data
 from ( 
    select 
      d2.id as id, 
      -- 1. разворачиваем массив 
      jsonb_array_elements(d2.data) as arr_element 
    from
      public."sample_table" d2  
    -- некий фильтр  
    -- where
    --   d2.some_field = 12345 
    ) t1 
    order by t1.id  
), 
-- 3. сворачиваем обратно 
 aggregated as ( 
 select 
  sample_id, 
  jsonb_agg(data) as data_edited
 from
  edited 
 group by edited.sample_id
) 
-- 4. апдейт 
update 
 public."sample_table" 
set 
 data = jsonb_set(data, '{"sample_id"}', a.data_edited, false)
from 
 aggregated a  
where 
 id = a.sample_id
returning * 
-----------------------------------------------------

Может быть потом опишу подробнее