Нет такого файла при указании свойств приложения с помощью Dockerfile для Spring Boot jar - PullRequest
0 голосов
/ 20 февраля 2020

Я использую Docker Compose для создания контейнера для приложения Spring Boot.

При получении docker-compose up я получаю следующие ошибки:

Воссоздание backend_springboot ... ошибка

ОШИБКА: для backend_springboot Невозможно запустить службу службы: сбой при создании OCI: контейнер_ linux. go: 346: запуск процесса контейнера вызвал "exe c: \" sh - c java -Dspring.config.location = / application.properties -D java .security.egd = файл: / dev /./ urandom $ JAVA_OPTS -jar /app.jar \ ": stat sh - c java -Dspring.config.location = / application.properties -D java .security.egd = файл: / dev /./ urandom $ JAVA_OPTS -jar /app.jar: нет такого файл или каталог ": неизвестно

ОШИБКА: для службы Невозможно запустить службу службы: сбой при создании OCI: контейнер_ linux. go: 346: запуск процесса контейнера вызвал" exe c: \ "sh - c java -Dspring.config.location = / application.properties -D java .security.egd = файл: / dev /./ urandom $ JAVA_OPTS -jar / app.jar \ ": stat sh - c java -Dspring.config.location = / application.properties -D java .security.egd = file: / dev /./ urandom $ JAVA_OPTS -jar /app.jar: нет такого файла или каталога ": неизвестно

Моя структура:

├── docker-compose.yml
├── spring-boot
│   ├── Dockerfile
│   ├── application.properties
│   └── backofficeservices-0.0.1.jar

docker -compose.yml

version: '3'
services:
  service:
    container_name: backend_springboot
    build: ./spring-boot
    ports:
      - "80:8080"
    restart: always

spring-boot / Dockerfile

FROM openjdk:8-jre-alpine as gradle

COPY backofficeservices-0.0.1.jar /app.jar

COPY application.properties /application.properties

ENV JAVA_OPTS=""

ENTRYPOINT ["sh -c java -Dspring.config.location=/application.properties -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar"]

EXPOSE 8080

Насколько я знаю, application.properties не найден. Я буду признателен за любую помощь в обнаружении моей ошибки.

Моя цель - запустить приложение Spring Boot, применяя application.properties, которое у меня есть.

1 Ответ

1 голос
/ 20 февраля 2020

Вы указали ENTRYPOINT, используя одно «слово». Когда вы запускаете контейнер, он пытается запустить его как одно «слово» - он ищет двоичный файл с именем sh -c java ..., с пробелами и всем как часть имени файла. Если в вашей команде несколько «слов», и вы используете форму JSON -array, вам нужно правильно вручную разбить ее на слова.

ENTRYPOINT ["sh", "-c", "java -Dspring.config.location=..."]

Dockerfile CMD и ENTRYPOINT довольно похожи ; оба обеспечивают часть команды, которую в конечном счете выполняет контейнер. Если вам нужен только один из них, я бы порекомендовал использовать CMD вместо этого по двум причинам: это облегчает получение оболочки отладки для встроенного образа docker run --rm -it myimage /bin/sh, и существует довольно стандартный шаблон использования сценария ENTRYPOINT для выполнения некоторых начальная настройка, а затем exec "$@" для запуска CMD.

CMD ["sh", "-c", "java -Dspring.config.location=..."]

Если у вас есть эта форма, Docker может предоставить вам оболочку sh -c ....

CMD java -Dspring.config.location=...

С немного больше очистки, что сделало бы финальный Dockerfile чем-то вроде

FROM openjdk:8-jre-alpine
COPY backofficeservices-0.0.1.jar /app.jar
COPY application.properties /application.properties
ENV JAVA_OPTS=""
CMD java \
      -Dspring.config.location=/application.properties \
      -Djava.security.egd=file:/dev/./urandom \
      $JAVA_OPTS \
      -jar /app.jar
EXPOSE 8080
...