Невозможно запустить Java-программу. Ошибка внутри докера

Я только новичок в Docker и изучал различные функции. Я успешно установил java внутри докера

**OS version**:Windows Server 2016

PS C:\testing> docker version
Client:
 Version:      17.03.1-ee-3
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64
Server:
   Version:      17.03.1-ee-3

 API version:  1.27 (minimum version 1.24)
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64
 Experimental: false
PS C:\testing>

Создал Dockerfile по пути C:\java-windows-docker\Dockerfile и поместил внутрь следующие строки:

 FROM windowsservercore  
  RUN powershell (new-object     
System.Net.WebClient).Downloadfile('http://javadl.oracle.com/webapps/download/AutoDL?
BundleId=210185', 'C:\jre-8u91-windows-x64.exe')
RUN powershell start-process -filepath C:\jre-8u91-windows-x64.exe -passthru -wait -argumentlist"/s,INSTALLDIR=c:\Java\jre1.8.0_91,/L,install64.log"
RUN del C:\jre-8u91-windows-x64.exe
CMD [ "c:\\Java\\jre1.8.0_91\\bin\\java.exe", "-version"]
It downloads the Java 8 Update 91 Windows installer and silently installs it to c:\Java\jre1.8.0_91.

docker build -t java-windows-docker C:\java-windows-docker И если мы его запустим, то после старта контейнер запускает Java и выводит свою версию.

PS C:\Windows\system32> docker run java-windows-docker
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
We have Java running. inside a Windows docker container which is hosted on a Windows server 2016

Я хочу запустить простую программу Java. Код в java-файлах выглядит следующим образом:

    class Hello{  
public static void main(String[] args){  
System.out.println("This is java app \n by using Docker");  
} 
}

Затем в качестве следующего шага я создал образ для вышеуказанной программы. Dockerfile для сборки Java-программы

FROM testing
WORKDIR C:\\testing
RUN javac Hello.java
CMD ["java","Hello"]

Когда я создаю образ, мне показывают следующую ошибку:

PS C:\testing> docker build -t testing C:\testing Отправка контекста сборки демону Docker 11,78 КБ Шаг 1/5: FROM java-windows-docker ---> 534f46817a18 Шаг 2/5: WORKDIR C:\testing - --> fc954983c8b0 Удаление промежуточного контейнера 5e30071d9159 Шаг 3/5: ЗАПУСК javac Hello.java ---> Запуск в c91c62ba707c javac' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. Команда 'cmd /S /C javac Hello.java' вернула ненулевой код: 1

Любой совет по этому поводу будет полезен. Если возможно, пожалуйста, помогите мне с образцом Dockerfile для запуска этой Java-программы. Я работаю над этим в течение последних двух дней, я не могу заставить это работать. Мне интересно, как установить путь внутри изображения докера и как это на самом деле работает. Я также пытался установить путь

ENV JAVA_HOME C:\Java\jre1.8.0_91\bin;
RUN setx PATH %PATH%;%JAVA_HOME%\bin
RUN setx CLASSPATH %CLASSPATH%;C:\Java\jre1.8.0_91;C:\testing;.;

Но это не работает. Я не знаю, когда устанавливать этот путь при создании java-образа или запуске java-программы. Пожалуйста, сообщите. Заранее спасибо


person syndy1989    schedule 09.06.2017    source источник
comment
Образы Docker подобны виртуальным машинам, застывшим во времени. Давайте рассмотрим: - windowsservercore ›› java-windows-docker - тестирование (из какого образа? самого?) Я думаю, что вы должны были создать тестовый образ из java-windows-docker. И когда вы создаете java-windows-docker, вы должны создать JAVA_HOME и добавить свою установку java в переменную среды PATH.   -  person Anderson Marques    schedule 09.06.2017


Ответы (2)


Я думаю, что вы не установили переменную среды в системе. Установите путь Java как:

  1. Мой компьютер -> Свойства системы -> Дополнительные параметры системы -> Нажмите Переменные среды.

  2. Нажмите «Создать»: введите имя переменной как: JAVA_HOME и значение переменной как: C:\Program Files\Java\jdk1.8.0_121\bin //Ваш путь к корзине Java.

person Vikas Suryawanshi    schedule 09.06.2017

Изображения имеют слои. Каждый слой состоит из: базы изображений + команд.

Давайте рассмотрим, вы создаете java-windows-docker:

 FROM windowsservercore  
 RUN powershell...
 RUN powershell...
 RUN del C:\jre-8u91-windows-x64.exe
 CMD [ "c:\\Java\\jre1.8.0_91\\bin\\java.exe", "-version"]

Вы должны добавить этот каталог в PATH и определить свой JAVA_HOME.

 FROM windowsservercore  
 RUN powershell...
 RUN powershell...
 RUN del C:\jre-8u91-windows-x64.exe
 RUN set JAVA_HOME=""c:\\Java\\jre1.8.0_91\\"
 RUN set PATH=%PATH%,%JAVA_HOME%\bin
 CMD [ "c:\\Java\\jre1.8.0_91\\bin\\java.exe", "-version"]

Таким образом, каждое приложение, работающее в этом контейнере (java-windows-docker), будет иметь доступ к Java независимо от каталога.

Затем ваш тестовый образ будет использовать в качестве основы образ java-windows-docker:

FROM java-windows-docker
WORKDIR C:\\testing
RUN javac Hello.java
CMD ["java","Hello"]

PS: я не был сосредоточен на синтаксисе. Только по концепции. Я сейчас не перед своей машиной разработки. ;)

person Anderson Marques    schedule 09.06.2017
comment
Привет, Андерсон. Тем не менее, это дает мне ту же ошибку PS C:\Users\Administrator› docker build -t testing C:\testing Отправка контекста сборки демону Docker 3,072 КБ Шаг 1/4: FROM final ---› 6dbb140824c1 Шаг 2/4 : WORKDIR C:\\testing ---› Использование кеша ---› a6b874bdd543 Шаг 3/4: RUN javac Hello.java ---› Запуск в a28e929b64f1 'javac' не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. Команда 'cmd /S /C javac Hello.java' вернула ненулевой код: 1 Я что-то упустил - person syndy1989; 12.06.2017
comment
Привет! После создания каждого контейнера ставим его на исполнение и входим в него. (docker exec -it имя_контейнера cmd/bash). Затем проверьте, правильно ли выполняются папки и ожидаемые команды. Если контейнер не такой, как вы хотите, вы можете запустить правильные команды внутри контейнера, чтобы исправить это. Затем отсоединитесь с помощью cmd+q+cmd+p и зафиксируйте изменения с помощью docker commit, создав новый образ. Вы сможете увидеть историю команд с помощью docker history image_name и сравнить ее с вашим Dockerfile. - person Anderson Marques; 12.06.2017
comment
Это похоже на реверс-инжиниринг. Иногда я наблюдаю за историей докеров некоторых контейнеров, созданных крупными игроками, и использую ее в качестве руководства для создания своих собственных файлов Dockerfile. Это очень помогает, когда вы не так хорошо знакомы со всеми командами или скриптами. Этот процесс может помочь вам в достижении вашей цели. - person Anderson Marques; 12.06.2017