1
- # syntax=docker/dockerfile:1.7
1
+ # syntax=docker/dockerfile:1.7.0
2
2
3
3
# full semver just for python base image
4
- ARG PYTHON_VERSION=3.11.9
4
+ ARG PYTHON_VERSION=3.11.11
5
5
6
6
FROM python:${PYTHON_VERSION}-slim-bullseye AS builder
7
7
8
8
# avoid stuck build due to user prompt
9
9
ARG DEBIAN_FRONTEND=noninteractive
10
10
11
11
# update apt-get repos and install dependencies
12
- RUN apt-get -qq update && apt-get -qq install \
13
- --no-install-recommends -y \
12
+ RUN apt-get -qq update \
13
+ && apt-get -qq install --no-install-recommends -y \
14
14
curl \
15
15
gcc \
16
16
libpq-dev \
@@ -24,26 +24,29 @@ ENV PIP_DEFAULT_TIMEOUT=100
24
24
25
25
# poetry env vars
26
26
ENV POETRY_HOME="/opt/poetry"
27
- ENV POETRY_VERSION=1.8.3
27
+ ENV POETRY_VERSION=1.8.5
28
28
ENV POETRY_VIRTUALENVS_IN_PROJECT=true
29
29
ENV POETRY_NO_INTERACTION=1
30
30
31
31
# path
32
32
ENV VENV="/opt/venv"
33
33
ENV PATH="$POETRY_HOME/bin:$VENV/bin:$PATH"
34
34
35
+ # create app directory and set as working directory
35
36
WORKDIR /app
36
37
38
+ # copy dependencies
37
39
COPY requirements.txt requirements.txt
38
40
41
+ # install poetry and dependencies
39
42
RUN python -m venv $VENV \
40
43
&& . "${VENV}/bin/activate" \
41
44
&& python -m pip install "poetry==${POETRY_VERSION}" \
42
45
&& python -m pip install -r requirements.txt
43
46
44
47
FROM python:${PYTHON_VERSION}-slim-bullseye AS dev
45
48
46
- ENV HOSTNAME= "${HOST:-localhost}"
49
+ # setup path
47
50
ENV VENV="/opt/venv"
48
51
ENV PATH="${VENV}/bin:${VENV}/lib/python${PYTHON_VERSION}/site-packages:/usr/local/bin:${HOME}/.local/bin:/bin:/usr/bin:/usr/share/doc:$PATH"
49
52
@@ -61,8 +64,8 @@ ENV WEB_CONCURRENCY=2
61
64
ARG DEBIAN_FRONTEND=noninteractive
62
65
63
66
# install dependencies
64
- RUN apt-get -qq update && apt-get -qq install \
65
- --no-install-recommends -y \
67
+ RUN apt-get -qq update \
68
+ && apt-get -qq install --no-install-recommends -y \
66
69
bat \
67
70
curl \
68
71
dpkg \
@@ -73,6 +76,7 @@ RUN apt-get -qq update && apt-get -qq install \
73
76
p7zip \
74
77
perl \
75
78
shellcheck \
79
+ sudo \
76
80
tldr \
77
81
tree \
78
82
&& rm -rf /var/lib/apt/lists/*
@@ -85,45 +89,55 @@ ARG USER_GID=$USER_UID
85
89
RUN groupadd --gid $USER_GID $USER_NAME \
86
90
&& useradd --uid $USER_UID --gid $USER_GID -m $USER_NAME
87
91
92
+ RUN echo "$USER_NAME ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USER_NAME \
93
+ && chmod 0440 /etc/sudoers.d/$USER_NAME
94
+
95
+ # copy virtual environment from builder stage
88
96
COPY --from=builder --chown=${USER_NAME}:${USER_GROUP} $VENV $VENV
89
97
90
98
# qol: tooling
91
99
RUN <<EOF
92
100
# !/usr/bin/env bash
93
- # gh
94
- curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
95
- chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
96
- echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null
97
- apt-get update && apt-get install --no-install-recommends gh -y
98
- apt-get remove dpkg -y
99
- rm -rf /var/lib/apt/lists/*
100
-
101
101
# fzf
102
102
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
103
103
yes | ~/.fzf/install
104
104
EOF
105
105
106
+ # switch to non-root user
106
107
USER $USER_NAME
107
108
108
109
# qol: .bashrc
109
- RUN tee -a "$HOME/.bashrc" <<EOF
110
+ RUN tee -a "$HOME/.bashrc" <<"EOF"
111
+
110
112
# shared history
111
113
HISTFILE=/var/tmp/.bash_history
112
114
HISTFILESIZE=100
113
115
HISTSIZE=100
114
116
115
117
stty -ixon
116
118
119
+ # fzf
117
120
[ -f ~/.fzf.bash ] && . ~/.fzf.bash
118
121
122
+ # asdf
123
+ # https://asdf-vm.com/guide/getting-started.html
124
+ export ASDF_DIR="$HOME/.asdf"
125
+ [[ -f "${ASDF_DIR}/asdf.sh" ]] && . "${ASDF_DIR}/asdf.sh"
126
+
127
+ # homebrew
128
+ export BREW_PREFIX="/home/linuxbrew/.linuxbrew/bin"
129
+ [[ -f "${BREW_PREFIX}/brew" ]] && eval "$(${BREW_PREFIX}/brew shellenv)"
130
+
119
131
# aliases
120
132
alias ..='cd ../'
121
133
alias ...='cd ../../'
122
134
alias ll='ls -la --color=auto'
135
+
123
136
EOF
124
137
125
138
FROM dev AS runner
126
139
140
+ # change working directory
127
141
WORKDIR /app
128
142
129
143
# $PATH
@@ -132,6 +146,8 @@ ENV PATH=$VENV_PATH/bin:$HOME/.local/bin:$PATH
132
146
# port needed by app
133
147
EXPOSE 8000
134
148
149
+ # run container indefinitely
135
150
CMD ["sleep" , "infinity" ]
136
151
137
- LABEL org.opencontainers.image.title="mvp"
152
+ # metadata
153
+ LABEL org.opencontainers.image.title="python-class"
0 commit comments