いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

HomebrewをインストールするDockerfileのサンプル

概要

f:id:gsf_zero1:20211029114204p:plain

よく忘れるので、ここにメモメモ。。。

最近はLinuxでもHomebrewが使えるようになっているので便利ですね。

DockerfileでHomebrewをインストール済みの状態にしておきたかったので、調べてたら以下のような形になりました。

Dockerfile

# syntax=docker/dockerfile:1-labs
FROM buildpack-deps:stable-scm

#---------------------------------------------
# BUILD ARGUMENTS
#---------------------------------------------
ARG UID=1000
ARG USERNAME=dev
ARG HOMEDIR=/home/${USERNAME}
ARG PKGS_ESSENTIAL="zip unzip bash-completion build-essential sudo file time less man-db"
ARG PKGS_EDITOR="vim exuberant-ctags"
ARG PKGS_LOCALE="tzdata locales"
ARG PKGS_UTILS="jq lsof iputils-ping net-tools ncat psmisc"

#---------------------------------------------
# ROOT OPERATIONS
#---------------------------------------------
USER root
# >>> Install packages
ENV DEBIAN_FRONTEND=noninteractive
RUN <<EOF
        apt-get update -q
        apt-get install -yq --no-install-recommends ${PKGS_ESSENTIAL} ${PKGS_EDITOR} ${PKGS_LOCALE} ${PKGS_UTILS}
        apt-get clean -y
        rm -rf /var/cache/debconf/* /var/lib/apt/lists/* /tmp/* /var/tmp/*
EOF
ENV DEBIAN_FRONTEND=
# >>> Build locales
RUN <<EOF
        locale-gen ja_JP.UTF-8
        localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
        ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
EOF
ENV LANG=ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ Asia/Tokyo
# >>> Create user with sudo permission
RUN <<EOF
        useradd -l -u ${UID} -G sudo -md ${HOMEDIR} -s /bin/bash -p ${USERNAME} ${USERNAME}
        sed -i.bkp -e 's/%sudo\s\+ALL=(ALL\(:ALL\)\?)\s\+ALL/%sudo ALL=NOPASSWD:ALL/g' /etc/sudoers
EOF
ENV HOME=${HOMEDIR}
WORKDIR $HOME

#---------------------------------------------
# NON-ROOT USER OPERATIONS
#---------------------------------------------
USER dev
# >>> Base settings
RUN <<EOF
        sudo echo "Running 'sudo' for dev: success"
        mkdir -p /home/dev/.bashrc.d
        (echo; echo "for i in \$(ls -A \$HOME/.bashrc.d/); do source \$HOME/.bashrc.d/\$i; done"; echo) >> /home/dev/.bashrc
EOF
# >>> Vim settings
RUN <<EOF
        git clone https://gist.github.com/1a16cd5b551fe4e76ae941abb658b893.git vim-config-files
        cp vim-config-files/.vimrc ${HOMEDIR}
        rm -rf vim-config-files
EOF
# >>> Homebrew settings
RUN <<EOF
        mkdir ~/.cache
        /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
EOF
ENV PATH=$PATH:/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin/
ENV MANPATH="$MANPATH:/home/linuxbrew/.linuxbrew/share/man"
ENV INFOPATH="$INFOPATH:/home/linuxbrew/.linuxbrew/share/info"
ENV HOMEBREW_NO_AUTO_UPDATE=1

#---------------------------------------------
# MISC
#---------------------------------------------
WORKDIR /workspace
VOLUME /workspace

試してみる

これでコンテナ起動して確認してみると

$ ls -1
Dockerfile

$ docker image build -q .
sha256:88236b5315c4810120fd45bfcc6ec05c835aea7c243eb0f0bc73cbfc4e6f6adb

$ docker container run -it --rm 882 bash

dev@0433c1346497:/workspace$ which brew
/home/linuxbrew/.linuxbrew/bin/brew

dev@0433c1346497:/workspace$ brew doctor
Your system is ready to brew.

dev@f93b5b90a342:/workspace$ go
bash: go: コマンドが見つかりません

dev@0433c1346497:/workspace$ brew install -q golang
🍺  /home/linuxbrew/.linuxbrew/Cellar/go/1.17.6: 10,822 files, 537.5MB
==> Running `brew cleanup go`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

dev@0433c1346497:/workspace$ go version
go version go1.17.6 linux/amd64

Gitpod の Dockerfile はとても参考になる

基本、Dockerfileで何かしらべようとするとき、私はよくGitpodのDockerfileを参考にしています。

github.com

いろんなやり方が書いてあるのでとても参考になります。

あと、基本的な構成は buildpack-deps を見て勉強することが多いです。こちらもとても参考になります。

github.com

参考情報

brew.sh


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com