Ошибка создания среды выполнения OCI: container_ linux. go: 349: запуск процесса контейнера вызвал "exe c: \" java \ ": исполняемый файл не найден в $ PATH" - PullRequest
0 голосов
/ 07 мая 2020

У меня есть приложение Java Spring Boot, которое работает с базой данных Postgres. Я хочу использовать Docker для них обоих. Первоначально я создал файл docker -compose.yml, как показано ниже:

version: '3.2'
services:
  postgres:
    restart: always
    container_name: sample_db
    image: postgres:10.4
    ports:
      - '5432:5432'
    environment:
         - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
         - POSTGRES_USER=${POSTGRES_USER}
         - POSTGRES_DB=${POSTGRES_DB}
# APP**
  web:
    build: .
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/test
    expose:
      - '8080'
    ports:
      - '8080:8080'

Затем внутри файла application.properties я определил следующие свойства.

server.port=8080
spring.jpa.generate-ddl=true


spring.datasource.url=jdbc:postgresql://postgres:5432/test
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.flyway.baseline-on-migrate=true
spring.flyway.enabled=true

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = validate
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: true

Также , Я создал файл Dockerfile в каталоге своего проекта, который выглядит следующим образом:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
EXPOSE 8080
RUN mkdir -p /app/
RUN mkdir -p /app/logs/
COPY target/household-0.0.1-SNAPSHOT.jar /app/app.jar
FROM postgres
ENV POSTGRES_PASSWORD postgres
ENV POSTGRES_DB testdb
COPY schema.sql /docker-entrypoint-initdb.d/
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

Я выполнил эти команды и получил ошибку, указанную ниже.

mvn clean package docker build ./ -t springbootapp
docker -compose up

ERROR: for household-appliances_web_1  Cannot start service web: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"java\": executable file not found in $PATH": unknown

ERROR: for web  Cannot start service web: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"java\": executable file not found in $PATH": unknown
ERROR: Encountered errors while bringing up the project.

Любезно помогите в этом!

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

application.properties содержимое файла не имеет отношения к вопросу, поэтому вы можете его удалить. Давайте посмотрим на ваш Dockerfile, я удалю ненужный код

FROM openjdk:8-jdk-alpine
COPY target/household-0.0.1-SNAPSHOT.jar /app/app.jar

FROM postgres
COPY schema.sql /docker-entrypoint-initdb.d/
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

Итак, вы используете многоступенчатую сборку, вы просто копируете файл с хоста на первый этап. На последнем этапе вы используете изображение postgres и говорите установить ENTRYPOINT на java, но java не существует в образе postgres.

Что вы должны изменить:

У вас должно быть содержимое postgres, отделенное от контейнера java, как в файле docker-compose.yml, а во втором предложении используйте CMD вместо ENTRYPOINT. Ваш окончательный файл Dockerfile должен быть

FROM openjdk:8-jdk-alpine
COPY target/household-0.0.1-SNAPSHOT.jar /app/app.jar
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]
0 голосов
/ 07 мая 2020

Строка FROM postgres создает второй образ (это многоступенчатая сборка ), основанный на сервере базы данных PostgreSQL. Все, что находится выше этой линии, игнорируется. Итак, в вашем окончательном образе запущена вторая база данных, а не JVM.

Вам не нужна эта строка, и вам не нужно расширять сервер базы данных для запуска клиента. Вы можете удалить эту строку, и приложение запустится.

Вам также придется отдельно загрузить этот файл схемы в контейнер базы данных. Просто подключите файл в volumes: в файл docker-compose.yml - это простой путь. Если в вашем приложении есть система миграции базы данных, запуск миграции при запуске будет более надежным подходом.

...