2017-11-09 20 views
1

docker에서 내 clojure 프로젝트를 컨테이너 화합니다. 컨테이너가 성공적으로 빌드되고 java 1.8.0_151 및 lein 2.8.1이 모두 실행됩니다. 그러나 링 서버를 시작하려고하면이 예외가 발생합니다. 그러나 Mac 환경에서 동일한 코드를 실행하면 모든 것이 정상적으로 실행됩니다.lein 링 서버가 도커 컨테이너 안에 java.io.FileNotFoundException을 던졌습니다.

예외 :

$ docker-compose up 
Starting clojurejournal_clojure_journal_1 ... 
Starting clojurejournal_clojure_journal_1 ... done 
Attaching to clojurejournal_clojure_journal_1 
clojure_journal_1 | --> INFO: starting lein ring server 
clojure_journal_1 | Nov 09, 2017 12:16:18 PM com.mchange.v2.log.MLog <clinit> 
clojure_journal_1 | INFO: MLog clients using java 1.4+ standard logging. 
clojure_journal_1 | 2017-11-09 12:16:20.027:INFO:oejs.Server:jetty-7.6.1.v20120215 
clojure_journal_1 | 2017-11-09 12:16:20.084:INFO:oejs.AbstractConnector:Started [email protected]:3000 
clojure_journal_1 | Started server on port 3000 
clojure_journal_1 | Exception in thread "main" java.io.FileNotFoundException: http://localhost:3000, compiling:(/tmp/form-init462348242831821276.clj:1:71) 
clojure_journal_1 | at clojure.lang.Compiler.load(Compiler.java:7142) 
clojure_journal_1 | at clojure.lang.Compiler.loadFile(Compiler.java:7086) 
clojure_journal_1 | at clojure.main$load_script.invoke(main.clj:274) 
clojure_journal_1 | at clojure.main$init_opt.invoke(main.clj:279) 
clojure_journal_1 | at clojure.main$initialize.invoke(main.clj:307) 
clojure_journal_1 | at clojure.main$null_opt.invoke(main.clj:342) 
clojure_journal_1 | at clojure.main$main.doInvoke(main.clj:420) 
clojure_journal_1 | at clojure.lang.RestFn.invoke(RestFn.java:421) 
clojure_journal_1 | at clojure.lang.Var.invoke(Var.java:383) 
clojure_journal_1 | at clojure.lang.AFn.applyToHelper(AFn.java:156) 
clojure_journal_1 | at clojure.lang.Var.applyTo(Var.java:700) 
clojure_journal_1 | at clojure.main.main(main.java:37) 
clojure_journal_1 | Caused by: java.io.FileNotFoundException: http://localhost:3000 
clojure_journal_1 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
clojure_journal_1 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
clojure_journal_1 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
clojure_journal_1 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
clojure_journal_1 | at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1944) 
clojure_journal_1 | at sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:1939) 
clojure_journal_1 | at java.security.AccessController.doPrivileged(Native Method) 
clojure_journal_1 | at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1938) 
clojure_journal_1 | at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1508) 
clojure_journal_1 | at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) 
clojure_journal_1 | at javax.swing.JEditorPane.getStream(JEditorPane.java:768) 
clojure_journal_1 | at javax.swing.JEditorPane.setPage(JEditorPane.java:432) 
clojure_journal_1 | at javax.swing.JEditorPane.setPage(JEditorPane.java:880) 
clojure_journal_1 | at javax.swing.JEditorPane.<init>(JEditorPane.java:274) 
clojure_journal_1 | at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
clojure_journal_1 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
clojure_journal_1 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
clojure_journal_1 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
clojure_journal_1 | at clojure.lang.Reflector.invokeConstructor(Reflector.java:180) 
clojure_journal_1 | at clojure.java.browse_ui$open_url_in_swing.invoke(browse_ui.clj:15) 
clojure_journal_1 | at clojure.lang.Var.invoke(Var.java:379) 
clojure_journal_1 | at clojure.java.browse$open_url_in_swing.invoke(browse.clj:64) 
clojure_journal_1 | at clojure.java.browse$browse_url.invoke(browse.clj:76) 
clojure_journal_1 | at ring.server.standalone$open_browser_to.invoke(standalone.clj:39) 
clojure_journal_1 | at ring.server.standalone$serve$fn__1676.invoke(standalone.clj:102) 
clojure_journal_1 | at ring.server.standalone$try_port.invoke(standalone.clj:16) 
clojure_journal_1 | at ring.server.standalone$serve.doInvoke(standalone.clj:95) 
clojure_journal_1 | at clojure.lang.RestFn.invoke(RestFn.java:423) 
clojure_journal_1 | at ring.server.leiningen$serve.invoke(leiningen.clj:20) 
clojure_journal_1 | at user$eval3389.invoke(form-init462348242831821276.clj:1) 
clojure_journal_1 | at clojure.lang.Compiler.eval(Compiler.java:6703) 
clojure_journal_1 | at clojure.lang.Compiler.eval(Compiler.java:6693) 
clojure_journal_1 | at clojure.lang.Compiler.load(Compiler.java:7130) 
clojure_journal_1 | ... 11 more 
clojure_journal_1 | Caused by: java.io.FileNotFoundException: http://localhost:3000 
clojure_journal_1 | at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1890) 
clojure_journal_1 | at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) 
clojure_journal_1 | at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) 
clojure_journal_1 | at javax.swing.JEditorPane.getStream(JEditorPane.java:733) 
clojure_journal_1 | ... 33 more 

dockerfile :

FROM ubuntu:xenial 

LABEL maintainer=freid 
ENV WORK_DIR /var/www 

# install dependancies 
RUN apt-get update 
RUN apt-get install -y default-jre curl wget 

RUN wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein 
RUN chmod +x lein 
RUN mv lein /usr/local/bin 

# copy to /var/www 
COPY . $WORK_DIR 

# make it a working directory 
WORKDIR $WORK_DIR 

# fix permissions 
RUN chmod a+x /var/www/entrypoint.sh 

# expose port 3000 
EXPOSE 3000 

# make entrypoint 
ENTRYPOINT ["/bin/sh", "/var/www/entrypoint.sh"] 

고정 표시기-작성 :

clojure_journal: 
    image: clojure_journal:latest 
    command: run 
    ports: 
    - 3000:3000 
    volumes: 
    - .:/opt/clojure_journal 

entrypoint.sh

#!/usr/bin/env bash 

start(){ 
    echo "--> INFO: starting lein ring server" 
    lein ring server 
} 

case $1 in 

run) 
    shift 1 
    start [email protected] 
;; 

*) 
    >&2 echo "---> INFO: running: '$1'." 
;; 
esac 
+2

가 보이는 : 당신은 단지 OpenJDK image를 사용하고 Dockerfile 훨씬 더 간단 할 수 있음을 의미 당신이 Leiningen가 설치되어 있지 않아도 그런 식으로, // localhost를 : 시작하는 동안 컨테이너에서 3000 번, 아마도 당신이 원하는 것은 아니겠습니까? 난 그냥 컨테이너에서 HTTP 서버를 실행하려는 가정합니다. entrypoint.sh 스크립트에서'lein ring server-headless'를 시도하면 브라우저를 여는 것을 막을 수 있습니다. 또한, 프로젝트를 그냥'leberjar'하고 독립 실행 형 JAR을 컨테이너에 복사하여'java'로 실행할 수도 있습니다. –

답변

1

예외 스택 추적을 보면 시작하는 동안 브라우저에서 코드가 http://localhost:3000으로 열리는 것처럼 보입니다. 이는 컨테이너에서 원하는 것이 아니기 때문일 수 있습니다. 난 당신이 컨테이너에서 HTTP 서버를 실행하려는 가정합니다. 프로젝트를 lein uberjar 당신의 용기에 독립 JAR를 복사하여 그것을 실행하는 것이 가능 (쉽게)이기도 브라우저 여담으로

을 열려고하는 것을 방지 할, 당신의 entrypoint.sh 스크립트에서 lein ring server-headless 시도 java, Docker 이미지를 개발 환경으로 사용하지 않는다고 가정합니다. 코드가 브라우저에서 http를 열려고 같은

FROM java:8-alpine  
ADD path/to/your.jar /your-app/app.jar 
EXPOSE 3000 
CMD ["java", "-jar", "/your-app/app.jar"] 
1

@Taylor Wood 님의 의견에 따르면 lein ring server-headless을 사용하여 문제가 해결되었습니다.