2017-05-22 31 views
1

ドッカーを使用してScalaアプリケーションを実行しようとしています。私は、次の構造のサンプルプロジェクトを作成しました。java.lang.RuntimeException:メインクラスが見つかりません

build.sbt

name := "test" 
version := "1.0" 
scalaVersion := "2.12.2" 

プロジェクト/ build.properties

sbt.version = 0.13.15 

のsrc /メイン/スカラ座/ HelloWorld.scala

object HelloWorld { 
    def main(args: Array[String]): Unit = { 
    println("Hello, world!") 
    } 
} 

今私がsbt runを行うと、すべて正常に動作し、私は素敵なこんにちは世界の挨拶をしています。

$ sbt run 
... 
[info] Set current project to test (in build file:/Users/yuchen/Documents/test/) 
[info] Running HelloWorld 
Hello, world! 
[success] Total time: 1 s, completed 22-May-2017 4:30:28 PM 

私はDockerfileをaded:

FROM openjdk:8 

ENV SCALA_VERSION 2.12.2 
ENV SBT_VERSION 0.13.15 

RUN touch /usr/lib/jvm/java-8-openjdk-amd64/release 

RUN \ 
    curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /root/ && \ 
    echo >> /root/.bashrc && \ 
    echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc 

RUN \ 
    curl -L -o sbt-$SBT_VERSION.deb http://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \ 
    dpkg -i sbt-$SBT_VERSION.deb && \ 
    rm sbt-$SBT_VERSION.deb && \ 
    apt-get update && \ 
    apt-get install sbt && \ 
    sbt sbtVersion 

WORKDIR /root 

CMD sbt run 

彼らはすべてのhttps://hub.docker.com/r/hseeberger/scala-sbt/~/dockerfile/からコピーされ、追加の最後の行CMD sbt runとされています。

そして私は、ドッキングウィンドウのコマンドを実行してみました:

docker build -t test . 
docker tag test test/test:1.0 
docker run test/test:1.0 

はしかし、私はこのエラーを取得しておいてください。

[info] Set current project to root (in build file:/root/) 
[info] Updating {file:/root/}root... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
java.lang.RuntimeException: No main class detected. 
     at scala.sys.package$.error(package.scala:27) 
[trace] Stack trace suppressed: run last compile:run for the full output. 
[error] (compile:run) No main class detected. 
[error] Total time: 0 s, completed May 23, 2017 4:00:19 AM 

それが何を意味し、どのように私はこの問題を解決するのですか? FYI


:私はhttp://www.scala-sbt.org/sbt-native-packager/formats/docker.htmlの承知していますが、ちょうど私がこれを勉強としてDockerfileを書いてみたいと思います。

+0

あなたのデバッグ出力は私にとっては意味がありません。それらは実際にコマンドが使用されていますか?コンテナからの出力は、 '/ Users/yuchen/Documents/test /'の 'build.properties'ファイルで' sbt.version'を見つけることができないと言っています。しかし、 'Dockerfile'はどんなフォルダにも何もコピーせず、実行コマンドはボリュームをマウントしません。エラーは代わりに 'file:/ root /'を表示する必要があります。 –

+0

こんにちは@AndyShinn申し訳ありませんが、私はランダムなものを試していました。そのうちの1人が '/ root'を私の実際の作業ディレクトリに変更していました。明らかに、それは問題を解決しませんでした。私は 'WORKDIR/root'でコマンドを再実行し、出力ログを更新しました。どんな考えや提案がここに間違っていますか? –

答えて

1

私は本当にsbtを知らない。しかし、これはあなたがイメージにプロジェクトをコピーしていないように見えます(Dockerfileにははありません)。

のようなものをやってみてください。

FROM openjdk:8 

ENV SCALA_VERSION 2.12.2 
ENV SBT_VERSION 0.13.15 

RUN touch /usr/lib/jvm/java-8-openjdk-amd64/release 

RUN \ 
    curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /root/ && \ 
    echo >> /root/.bashrc && \ 
    echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc 

RUN \ 
    curl -L -o sbt-$SBT_VERSION.deb http://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \ 
    dpkg -i sbt-$SBT_VERSION.deb && \ 
    rm sbt-$SBT_VERSION.deb && \ 
    apt-get update && \ 
    apt-get install sbt && \ 
    sbt sbtVersion 

WORKDIR /myapp 

CMD sbt run 

COPY . /myapp 

ここでさらには/myappにしても、このフォルダに作業ディレクトリを変更するすべてのコードをコピーするだけでCOPYです。これは、ビルドコンテキストを/myappにコピーし、WORKDIRは同じフォルダからsbt runを実行する必要があります。

+0

ありがとう!まさにそれが問題なのです!あなたはなぜ「コピーするか」を知っていますか?/ myapp'は 'CMD sbt run'の前にある必要はありませんか? –

+1

'CMD'は、このイメージに基づいてコンテナを起動するときに実行されるデフォルトのコマンドを設定しています。ビルド時に実際には何も実行されていないので、 'Dockerfile'にどこに表示されるかは関係ありません。 –

関連する問題