haskell環境をDocker on M1 mac で動かしたい
上記に加えて色々入れている。
この記事も参考にしていきたい。
# reference for this Dockerfile configuration: https://stackoverflow.com/questions/67680726/installing-haskells-cabal-or-ghcup-inside-a-dockerfile-wont-work
# Only Arm architecture
FROM debian:stable-slim as build
# Install dependencies *You don't need all of them
RUN apt-get update -y \
&& apt-get upgrade -y \
&& apt-get install -y git sudo jq bc make automake \
&& apt-get install -y rsync htop curl build-essential lsb-release \
&& apt-get install -y pkg-config libffi-dev libgmp-dev software-properties-common \
&& apt-get install -y libssl-dev libtinfo-dev libsystemd-dev \
&& apt-get install -y zlib1g-dev make g++ wget libncursesw5 libtool autoconf \
&& apt-get clean
RUN wget https://apt.llvm.org/llvm.sh
RUN chmod +x llvm.sh
RUN sudo ./llvm.sh 12
# Install ghcup
ENV BOOTSTRAP_HASKELL_NONINTERACTIVE=1
RUN bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh"
# Add ghcup to PATH
ENV PATH=${PATH}:/root/.local/bin
ENV PATH=${PATH}:/root/.ghcup/bin
# Install cabal
RUN bash -c "ghcup upgrade"
RUN bash -c "ghcup install cabal 3.4.0.0"
RUN bash -c "ghcup set cabal 3.4.0.0"
# Install GHC
RUN bash -c "ghcup install ghc 8.10.7"
RUN bash -c "ghcup set ghc 8.10.7"
# Update Path to include Cabal and GHC exports
RUN bash -c "echo PATH="$HOME/.local/bin:$PATH" >> $HOME/.bashrc"
RUN bash -c "echo export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" >> $HOME/.bashrc"
RUN bash -c "source $HOME/.bashrc"
# Update cabal
RUN bash -c "cabal update"
> [ 6/15] RUN bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh":
#9 2.511
#9 2.511 Welcome to Haskell!
#9 2.511
#9 2.511 This script will download and install the following binari
[2022-03-12T01:35:05.622Z] es:
#9 2.511 * ghcup - The Haskell toolchain installer
#9 2.511 * ghc - The Glasgow Haskell Compiler
#9 2.511 * cabal - The Cabal build tool for managing Haskell software
#9 2.511 * stack - (optional) A cross-platform program for developing Haskell projects
#9 2.511 * hls - (optional) A language server for developers to integrate with their editor/IDE
#9 2.511
#9 2.511 ghcup installs only into the following directory,
#9 2.511 which can be removed anytime:
#9 2.511 /root/.ghcup
#9 2.511
#9 2.526 % Total % Received % Xferd Average Speed Time Time Time Current
#9 2.526 Dload Upload Total Spent Left Speed
#9 2.526
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
24 45.7M 24 11.1M 0 0 7106k 0 0:00:06 0:00:01 0:00:05 7102k
40 45.7M 40 18.7M 0 0 7278k 0 0:00:06 0:00:02 0:00:04 7275k
[2022-03-12T01:35:05.622Z]
52 45.7M 52 24.1M 0 0 6711k 0 0:00:06 0:00:03 0:00:03 6709k
62 45.7M 62 28.4M 0 0 6286k 0 0:00:07 0:00:04 0:00:03 6285k
72 45.7M 72 33.1M 0 0 6049k 0 0:00:07 0:00:05 0:00:02 6803k
83 45.7M 83 38.4M 0 0 5957k 0 0:00:07 0:00:06 0:00:01 5586k
94 45.7M 94 43.2M 0 0 5804k 0 0:00:08 0:00:07 0:00:01 5024k
100 45.7M 100 45.7M 0 0 5888k 0 0:00:07 0:00:07 --:--:-- 5180k
#9 10.50 /root/.ghcup/bin/ghcup: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
#9 10.50 "_eghcup upgrade" failed!
------
executor failed running [/bin/sh -c bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh"]: exit code: 2
[2022-03-12T01:35:05.643Z] Stop (150224 ms): Run: docker build -f /Users/mie/Work/haskell_playground/.devcontainer/Dockerfile -t vsc-haskell_playground-a79a60ea2acb2848c274d2fb93907a6f /Users/mie/Work/haskell_playground
[2022-03-12T01:35:05.658Z] Command failed: docker build -f /Users/mie/Work/haskell_playground/.devcontainer/Dockerfile -t vsc-haskell_playground-a79a60ea2acb2848c274d2fb93907a6f /Users/mie/Work/haskell_playground
[2022-03-12T01:35:05.658Z] Exit code 1
エラー発生。
参考に sudo apt-get install libnuma-dev
してみる
build は通った。
とりあえずこの状況で
cabal install --lib vector
はできていそう。
続いて、VScode remote container で開発するためのツールなどを入れていく。
devcontainer.json
は雑にこんな感じで良さそう。
{
"name": "HaskellDevContainer",
"build": { "dockerfile": "Dockerfile", "context": ".." },
"extensions": ["haskell.haskell", "justusadam.language-haskell"]
}
haskell-language-server を入れる。
Dockerfile に以下を追記
RUN bach -c "ghcup install hls"
rebuild.
.vscode/settings.json に以下を追記
{
"haskell.serverExecutablePath": "/root/.ghcup/bin/haskell-language-server-8.10.7"
}
これでひとまず intellisence など動いている感じ。
vsc-haskell_playground-a79a60ea2acb2848c274d2fb93907a6f latest 8df8dbf8ff10 12 minutes ago 7.08GB
でっかい image
せっかくなので、前から煩わしかった docker container 内で秘密鍵を共有して git ssh を通す方法もここで考えてみる。
上記の記事を参考に、entrypoint を使って private key をコピーしてみる。
しかし、vscode remote container 環境では ENTRYPOINT は勝手に override されるため、勝手に定義しても使えないらしい ("overrideCommand": false
とかすると使えるけど、今度はコンテナが自動的に終了してしまう、など。)
entrypoint は使わない方向で、docker secrets を使ってみることにした。
色々調べたが、secrets を使う場合は docker-compose を使った方が楽そうだったので compose に切り替える。
devcontainer.json をこんな感じに編集して、
{
"name": "HaskellDevContainer",
// "build": { "dockerfile": "Dockerfile", "context": ".." },
"service": "haskell-vsc",
"workspaceFolder": "/workspace",
"dockerComposeFile": "../docker-compose.yml",
"extensions": ["haskell.haskell", "justusadam.language-haskell"]
}
docker-compose.yaml をプロジェクトルートに用意。
version: "3.9"
services:
haskell-vsc:
build:
context: .
dockerfile: .devcontainer/Dockerfile
command: /bin/sh -c "while sleep 1000; do :; done"
secrets:
- id_rsa
volumes:
- .:/workspace
secrets:
id_rsa:
file: ~/.ssh/id_rsa
Dockerfile にて secrets を参照して ssh private key を保持する設定と git に関する config を色々追加。
# setup private-key for git-ssh
RUN bash -c "mkdir -p /root/.ssh && ln -s /run/secrets/id_rsa /root/.ssh/id_rsa"
RUN bash -c "chown -R root:root /root/.ssh"
RUN bash -c "chmod -R 0600 /root/.ssh"
RUN bash -c "git config --global core.sshCommand \"ssh -i /root/.ssh/id_rsa\" /dev/null"
RUN bash -c "git config --global user.name \"mie998\""
RUN bash -c "git config --global user.email \"nishiwaki.kyoto@gmail.com\""
これでコンテナ内部でも github に ssh 接続ができる!
git の user.name と user.email はここにベタ書きしなくてもホスト側の設定値から自動で取れるかもしれない。。。
これを参考に、.gitconfig の volume を作成するのがベストか。