Skip to content

Instantly share code, notes, and snippets.

@BrutalSimplicity
Created September 1, 2022 20:20
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save BrutalSimplicity/882af1d343b7530fc7e005284523d38d to your computer and use it in GitHub Desktop.
Save BrutalSimplicity/882af1d343b7530fc7e005284523d38d to your computer and use it in GitHub Desktop.
Dockerfile with asdf + docker install bits
FROM debian:latest
# Install basic dev packages
RUN apt-get clean && apt-get update && apt-get -y install --no-install-recommends \
apt-utils \
openssh-client \
git \
gnupg2 \
dirmngr \
iproute2 \
procps \
lsof \
htop \
net-tools \
psmisc \
curl \
wget \
rsync \
ca-certificates \
unzip \
zip \
nano \
vim \
neovim \
less \
jq \
lsb-release \
apt-transport-https \
dialog \
libc6 \
libgcc1 \
libkrb5-3 \
libgssapi-krb5-2 \
libicu[0-9][0-9] \
liblttng-ust0 \
libstdc++6 \
zlib1g \
locales \
sudo \
ncdu \
man-db \
strace \
manpages \
manpages-dev \
init-system-helpers \
make \
build-essential \
# python runtime dependencies
openssl \
bzip2 \
libreadline8 \
sqlite3 \
tk \
xz-utils \
libxml2 \
llvm \
# python build dependencies
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
libncursesw5-dev \
tk-dev \
libxml2-dev \
libxmlsec1-dev \
libffi-dev \
liblzma-dev \
# some useful dev utils
fd-find \
bat \
tree \
zsh && \
ln -s $(which fdfind) /usr/local/bin/fd && \
ln -s $(which batcat) /usr/local/bin/bat && \
rm -rf /var/lib/apt/lists/*
# ensure we use bash for all RUN commands
# use -l to use interactive login shell
# and ensure modifications to bashrc are properly sourced
SHELL ["/bin/bash", "-lc"]
# install asdf to manage all the thingz!!!
RUN git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.8.1 && \
echo ". $HOME/.asdf/asdf.sh" >> /root/.bashrc && \
echo ". $HOME/.asdf/asdf.sh" >> /root/.zshrc
# install plugins
RUN asdf plugin add nodejs && \
asdf plugin add python && \
asdf plugin add golang && \
asdf plugin add awscli && \
asdf plugin add aws-sam-cli
# install python build dependencies since asdf
# builds from the source
RUN asdf install python 3.9.6 && \
asdf install nodejs 14.18.2 && \
asdf install golang 1.18.2
# set global versions
RUN asdf global python 3.9.6 && \
asdf global nodejs 14.18.2 && \
asdf global golang 1.18.2
# setup AWS tools separately since many depend on python
RUN asdf install awscli 2.7.28 && \
asdf install aws-sam-cli 1.56.0 && \
asdf global awscli 2.7.28 && \
asdf global aws-sam-cli 1.56.0
# upgrade python and node package managers and install nx workspace manager
RUN pip install --upgrade pip && npm i -g npm@latest && \
pip install pipenv==v2021.11.23 && npm i -g yarn@1.22
# install docker
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && \
apt-get -y --no-install-recommends install docker-ce=5:20.10.12~3-0~debian-bullseye docker-ce-cli=5:20.10.12~3-0~debian-bullseye containerd.io && \
rm -rf /var/lib/apt/lists/*
# easy docker compose and buildx install
COPY --from=docker:20.10 /usr/libexec/docker/cli-plugins /usr/libexec/docker/cli-plugins
RUN dockerd --version && \
docker --version && \
docker buildx version && \
docker compose version
# install boto3
RUN pip install boto3
# set all the things to be sure bash is always used as the default shell
RUN cd /bin && ln -sf bash sh && chsh -s /bin/bash
ENV SHELL=bash
ENV PATH=$PATH:/root/.bin
WORKDIR /root
ENTRYPOINT [ "/bin/bash", "-lc" ]
@thinkingerrol
Copy link

very nice! I was able to build it on Ubuntu 22.04 after only a few very minor changes:
https://gist.github.com/thinkingerrol/ba1c1e16c8fd487508ca2b9d0297a224/revisions
DOCKER_BUILDKIT=0 docker build .
probably no real need to disable buildkit, must be my local weirdness

@pvogel1967
Copy link

Nice! Thanks for the hints. I found that -lc didn't work and I had to go to -c but with a . "$/ASDF_DIR/asdf.sh \" before calls to ASDF, so I wound up with this:

RUN git config --global advice.detachedHead false \
  && git clone https://github.com/asdf-vm/asdf.git ~/.asdf \
  && pushd ~/.asdf \
  && git checkout "$(git describe --abbrev=0 --tags)" \
  && popd \
  && export ASDF_DIR=$HOME/.asdf \
  && echo ". \"$ASDF_DIR/asdf.sh\"" >> ~/.bashrc  \
  && . "$ASDF_DIR/asdf.sh" \
  && asdf plugin add nodejs \
  && asdf plugin add yarn \
  && asdf install nodejs 18.16.0 \
  && asdf install yarn 1.22.19 \
  && asdf global nodejs 18.16.0 \
  && asdf global yarn 1.22.19 

@thinkingerrol
Copy link

Apparently, unlike bash -l -c, bash -c just does not load the system-wide and user-specific profiles / bashrc files.
I can see it by comparing strace -e openat bash -c true and strace -e openat bash -lc true.
To force bash -c to load a specific file, it can also be started like BASH_ENV=$ASDF_DIR/asdf.sh bash -c python3 -c 'print("hello")'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment