Skip to content

Commit 68335a0

Browse files
committed
Parametrize Compose platform and trim Docker image caches
- Add DOCKER_PLATFORM support via shared platform anchor in compose.yaml and .env.dist - Switch Codex/Gemini install to Arch packages via VIM_PACKAGES and update README - Reduce image size by cleaning pacman, pyenv, pip, and poetry caches during build
1 parent 6655e79 commit 68335a0

4 files changed

Lines changed: 34 additions & 27 deletions

File tree

.env.dist

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ DOCKER_HOST_UID=1000
66
DOCKER_HOST_GID=1000
77
DOCKER_USER=developer
88
DOCKER_USER_HOME=/home/developer
9+
DOCKER_PLATFORM=linux/amd64
910

1011
MIRROR_LIST_COUNTRY=RU
1112
BUILD_PACKAGES="pyenv git gnupg sudo postgresql-libs mariadb-libs openmp"
12-
VIM_PACKAGES="python vim ctags ripgrep bat npm nodejs-lts-jod"
13-
NPM_GLOBAL_PACKAGES="@openai/codex @google/gemini-cli"
13+
VIM_PACKAGES="python vim ctags ripgrep bat npm nodejs-lts-jod openai-codex gemini-cli"
1414

1515
PYTHON_VERSION=3.14
1616
PYTHONUNBUFFERED=1
1717
PIP_DEFAULT_TIMEOUT=100
1818
POETRY_VERSION=2.2.1
1919
POETRY_OPTIONS_APP="--only main --compile"
20-
POETRY_OPTIONS_DEV="--no-root --with-dev --compile"
20+
POETRY_OPTIONS_DEV="--no-root --with dev --compile"
2121
POETRY_NO_INTERACTION=1
2222

2323
JUPYTER_TOKEN=_change_me_please_!1_

Dockerfile

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,17 @@ RUN set -eux; \
2424
| sed -e 's/^\s*#Server/Server/' -e '/^\s*#/d' \
2525
> /etc/pacman.d/mirrorlist; \
2626
grep -q '^Server' /etc/pacman.d/mirrorlist
27-
RUN pacman -Syu --noconfirm && pacman -S --noconfirm --needed $BUILD_PACKAGES
27+
RUN pacman -Syu --noconfirm && \
28+
pacman -S --noconfirm --needed $BUILD_PACKAGES && \
29+
pacman -Scc --noconfirm && \
30+
rm -rf /var/lib/pacman/sync/*
2831
RUN echo "${DOCKER_USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
2932
ENV PYENV_ROOT=$DOCKER_USER_HOME/.pyenv
3033
ENV PATH=$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH
31-
RUN pyenv install --skip-existing $PYTHON_VERSION
32-
RUN pyenv global $PYTHON_VERSION
33-
RUN pyenv rehash
34+
RUN pyenv install --skip-existing $PYTHON_VERSION && \
35+
pyenv global $PYTHON_VERSION && \
36+
pyenv rehash && \
37+
rm -rf "$PYENV_ROOT/cache" "$PYENV_ROOT/sources" /tmp/python-build*
3438
ENV PYTHONUNBUFFERED=1
3539
ENV PIP_DEFAULT_TIMEOUT=100
3640
ENV POETRY_NO_INTERACTION=1
@@ -64,30 +68,32 @@ ARG POETRY_OPTIONS_APP="--only main --compile"
6468
RUN poetry install $POETRY_OPTIONS_APP -n -v -C /build && \
6569
rm -rf $POETRY_CACHE_DIR/* && rm -rf $PIP_CACHE_DIR/*
6670
RUN sed -i "/\b\($DOCKER_USER\)\b/d" /etc/sudoers
67-
RUN pacman -Scc --noconfirm
6871
USER $DOCKER_USER
6972
WORKDIR /application
7073

7174
FROM python-base AS build-deps-dev
7275
ARG DOCKER_USER=devuser
76+
ARG VIM_PACKAGES="python vim ctags ripgrep bat npm nodejs-lts-jod openai-codex gemini-cli"
7377
ARG POETRY_OPTIONS_DEV="--no-root --with-dev --compile"
78+
RUN pacman -Sy --noconfirm && \
79+
pacman -S --noconfirm --needed $VIM_PACKAGES && \
80+
pacman -Scc --noconfirm && \
81+
rm -rf /var/lib/pacman/sync/*
7482
COPY pyproject.toml poetry.lock /build/
75-
RUN poetry install $POETRY_OPTIONS_DEV -n -v -C /build
83+
RUN poetry install $POETRY_OPTIONS_DEV -n -v -C /build && \
84+
rm -rf $POETRY_CACHE_DIR/* $PIP_CACHE_DIR/*
7685
RUN mkdir -p $POETRY_CACHE_DIR $PIP_CACHE_DIR && \
7786
chown -R $DOCKER_USER $POETRY_CACHE_DIR $PIP_CACHE_DIR
7887

7988
FROM build-deps-dev AS dev-build
8089
ARG DOCKER_USER=devuser
8190
USER $DOCKER_USER
8291
WORKDIR /application
92+
RUN git config --global --add safe.directory /application
8393

8494
FROM build-deps-dev AS vim-ide
8595
ARG DOCKER_USER=devuser
8696
ARG DOCKER_USER_HOME=/home/devuser
87-
ARG VIM_PACKAGES="python vim ctags ripgrep bat npm nodejs-lts-jod"
88-
ARG NPM_GLOBAL_PACKAGES=""
89-
RUN pacman -S --noconfirm --needed $VIM_PACKAGES
90-
RUN if [ -n "$NPM_GLOBAL_PACKAGES" ]; then npm install -g --no-fund --no-audit $NPM_GLOBAL_PACKAGES; fi
9197
USER $DOCKER_USER
9298
RUN curl -fLo $DOCKER_USER_HOME/.vim/autoload/plug.vim --create-dirs \
9399
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Use it as-is or tailor it to match your team's development workflow.
6464

6565
```bash
6666
cp .env.dist .env
67-
vim .env # Set OS packages, a released PYTHON_VERSION, Poetry version, etc., and your API keys for OPENAI_API_KEY and GEMINI_API_KEY.
67+
vim .env # Set OS packages, DOCKER_PLATFORM (if not linux/amd64), a released PYTHON_VERSION, Poetry version, etc., and your API keys for OPENAI_API_KEY and GEMINI_API_KEY.
6868
```
6969

7070
2. Set up Python project dependencies
@@ -114,7 +114,7 @@ docker compose run --rm app
114114
```
115115

116116
- Optional: Run Codex or Gemini (see more examples below)
117-
- Note: `codex` and `gemini` CLIs are installed during the image build via `NPM_GLOBAL_PACKAGES` in `.env`.
117+
- Note: `codex` and `gemini` CLIs are installed during the image build via Arch packages (`openai-codex`, `gemini-cli`) configured in `VIM_PACKAGES` inside `.env`.
118118

119119
```bash
120120
docker compose build codex

compose.yaml

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ x-default-env: &default-env
33
PIP_DEFAULT_TIMEOUT: "100"
44
PYTHONUNBUFFERED: "1"
55

6+
x-platform: &platform ${DOCKER_PLATFORM:-linux/amd64}
7+
68
x-default-args: &default-args
79
TZ: ${TZ:-Asia/Vladivostok}
810
DOCKER_HOST_UID: ${DOCKER_HOST_UID:-1000}
@@ -11,23 +13,22 @@ x-default-args: &default-args
1113
DOCKER_USER_HOME: ${DOCKER_USER_HOME:-/home/developer}
1214
MIRROR_LIST_COUNTRY: ${MIRROR_LIST_COUNTRY:-RU}
1315
BUILD_PACKAGES: ${BUILD_PACKAGES:-pyenv git gnupg sudo postgresql-libs mariadb-libs openmp}
14-
VIM_PACKAGES: ${VIM_PACKAGES:-python vim ctags ripgrep bat npm nodejs-lts-jod}
16+
VIM_PACKAGES: ${VIM_PACKAGES:-python vim ctags ripgrep bat npm nodejs-lts-jod openai-codex gemini-cli}
1517
PYTHON_VERSION: ${PYTHON_VERSION:-3.14}
1618
POETRY_VERSION: ${POETRY_VERSION:-2.2.1}
1719
POETRY_OPTIONS_APP: ${POETRY_OPTIONS_APP:---only main --compile}
18-
POETRY_OPTIONS_DEV: ${POETRY_OPTIONS_DEV:---no-root --with-dev --compile}
19-
NPM_GLOBAL_PACKAGES: ${NPM_GLOBAL_PACKAGES:-}
20+
POETRY_OPTIONS_DEV: ${POETRY_OPTIONS_DEV:---no-root --with dev --compile}
2021

2122
services:
2223
python-base:
23-
platform: linux/amd64
24+
platform: *platform
2425
build:
2526
target: python-base
2627
args: *default-args
2728
environment:
2829
<<: *default-env
2930
poetry:
30-
platform: linux/amd64
31+
platform: *platform
3132
entrypoint: poetry
3233
build:
3334
target: poetry
@@ -45,7 +46,7 @@ services:
4546
source: poetry-cache
4647
target: /var/cache/pypoetry
4748
vim-ide:
48-
platform: linux/amd64
49+
platform: *platform
4950
entrypoint: vim
5051
build:
5152
target: vim-ide
@@ -59,10 +60,10 @@ services:
5960
source: .
6061
target: /application
6162
gemini:
62-
platform: linux/amd64
63+
platform: *platform
6364
entrypoint: gemini
6465
build:
65-
target: vim-ide
66+
target: dev-build
6667
args: *default-args
6768
environment:
6869
<<: *default-env
@@ -72,10 +73,10 @@ services:
7273
source: .
7374
target: /application
7475
codex:
75-
platform: linux/amd64
76+
platform: *platform
7677
entrypoint: codex
7778
build:
78-
target: vim-ide
79+
target: dev-build
7980
args: *default-args
8081
environment:
8182
<<: *default-env
@@ -85,7 +86,7 @@ services:
8586
source: .
8687
target: /application
8788
jupyterlab:
88-
platform: linux/amd64
89+
platform: *platform
8990
entrypoint:
9091
- jupyter-lab
9192
- --port=8888
@@ -104,7 +105,7 @@ services:
104105
source: .
105106
target: /application
106107
app:
107-
platform: linux/amd64
108+
platform: *platform
108109
entrypoint: template_bin
109110
build:
110111
target: app-build

0 commit comments

Comments
 (0)