はじめに
最近、clojureと言う言語を聞いたので、その環境構築を行いました。
clojureはLISPをJVM仮装マシン上で動けるようにしたものです。
レポジトリはこちら
dockerのビルド
ディレクトリ構成
初回インストールを行うために以下の構成にしてあります。
後で、変更します。
├── Dockerfile
├── docker-compose.yaml
Dockerfile
FROM clojure:openjdk-8
WORKDIR /usr/src/app
# bashは入れても入れなくてもどっちでもいいです。
RUN apt-get update && apt-get install --no-install-recommends -y bash=5.0-4 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
docker-compose.yaml
version: '3'
services:
clojure:
build: .
tty: true # 後で、コンテナ内に入るため。終わったら消す。
インストールと永続化
docker-compose exec clojure bash -c "lein new app workspace"
docker cp `docker-compose ps -q clojure`:/usr/src/app/workspace/ ./
docker-compose.yamlを書き換える。
docker-compose.yaml
version: '3'
services:
clojure:
build: .
command: 'lein run'
working_dir: /usr/src/app/workspace
volumes:
- ./workspace:/usr/src/app/workspace
最終的なディレクトリ構成
作られたディレクトリの中身は完全にjavaですね。
├── Dockerfile
├── docker-compose.yaml
└── workspace
├── CHANGELOG.md
├── LICENSE
├── README.md
├── doc
│ └── intro.md
├── project.clj
├── resources
├── src
│ └── workspace
│ └── core.clj
├── target
│ └── default
│ ├── classes
│ │ └── META-INF
│ │ └── maven
│ │ └── workspace
│ │ └── workspace
│ │ └── pom.properties
│ └── stale
│ └── leiningen.core.classpath.extract-native-dependencies
└── test
└── workspace
└── core_test.clj
Hello, World!
最後に、docker compose up!!!
> docker compose up
Attaching to clojure_1
clojure_1 | Retrieving org/clojure/clojure/1.10.1/clojure-1.10.1.pom from central
clojure_1 | Retrieving org/clojure/spec.alpha/0.2.176/spec.alpha-0.2.176.pom from central
clojure_1 | Retrieving org/clojure/pom.contrib/0.2.2/pom.contrib-0.2.2.pom from central
clojure_1 | Retrieving org/clojure/core.specs.alpha/0.2.44/core.specs.alpha-0.2.44.pom from central
clojure_1 | Retrieving org/clojure/clojure/1.10.1/clojure-1.10.1.jar from central
clojure_1 | Retrieving org/clojure/spec.alpha/0.2.176/spec.alpha-0.2.176.jar from central
clojure_1 | Retrieving org/clojure/core.specs.alpha/0.2.44/core.specs.alpha-0.2.44.jar from central
clojure_1 | Hello, World!
clojure_1 exited with code 0
ビルドしていなければ、勝手にビルドしてくれるみたいですね。
ここは、go,javaよりも便利ですね。
workspace/src/workspace/core.clj
(ns workspace.core
(:gen-class))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Hello, World!"))
このファイルを書くかえれば、コーディングが行えます。