Closed5

haskell環境をDocker on M1 mac で動かしたい

三重三重

https://stackoverflow.com/questions/67680726/installing-haskells-cabal-or-ghcup-inside-a-dockerfile-wont-work
とりあえず上記の記事を参考に基本を構成する.
上記に加えて色々入れている。

https://qiita.com/kaizen_nagoya/items/193b044a40e0e6923f83

この記事も参考にしていきたい。

# 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

エラー発生。

https://stackoverflow.com/questions/57833459/error-while-loading-shared-libraries-libnuma-so-1-cannot-open-shared-object-fi

参考に 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 を通す方法もここで考えてみる。

https://www.nullpo.io/2020/04/30/docker-compose-secret/

上記の記事を参考に、entrypoint を使って private key をコピーしてみる。
しかし、vscode remote container 環境では ENTRYPOINT は勝手に override されるため、勝手に定義しても使えないらしい ("overrideCommand": false とかすると使えるけど、今度はコンテナが自動的に終了してしまう、など。)

https://github.com/microsoft/vscode-remote-release/issues/4209

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 はここにベタ書きしなくてもホスト側の設定値から自動で取れるかもしれない。。。

このスクラップは2022/03/12にクローズされました