Docker:OCI运行时创建失败:container_linux.go:349:启动容器进程引起“ exec:\” java \”:在$ PATH中找不到可执行文件”

时间:2020-05-07 11:04:43

标签: java spring postgresql spring-boot docker

我有一个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清洁包 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.

请问有人对此提供帮助!

3 个答案:

答案 0 :(得分:2)

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,但是在postgres图像中不存在Java。

您应该更改的内容:

您应该将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"]

答案 1 :(得分:0)

FROM postgres行创建了基于PostgreSQL数据库服务器的第二个映像(它是multi-stage build)。该行上方的所有内容都将被有效忽略。因此,您的最终映像正在运行第二个数据库,而不是JVM。

您不需要此行,也不需要扩展数据库服务器即可运行客户端。您可以删除此行,然后应用程序将启动。

您还必须将该架构文件单独放入数据库容器中。只需将文件绑定安装到volumes:中的docker-compose.yml中是一条简单的路径。如果您的应用程序中有数据库迁移系统,则在启动时运行迁移将是更可靠的方法。

答案 2 :(得分:0)

为Docker设置Rails应用程序时出现此错误:

我的docker-entrypoint.sh文件放置在应用程序的 root 文件夹中,内容如下:

#!/bin/sh

set -e

bundle exec rails server -b 0.0.0.0 -e production

在我的Dockerfile中,我这样定义了入口点命令:

RUN ["chmod", "+x", "docker-entrypoint.sh"]
ENTRYPOINT ["docker-entrypoint.sh"]

但是运行docker-compose up command时出现以下错误:

错误:针对应用程序无法启动服务应用程序:OCI运行时创建失败:container_linux.go:349:启动容器进程导致“ exec:” docker-entrypoint.sh”:在$中找不到可执行文件 PATH”:未知

这是我修复的方式

指定docker-entrypoint.sh文件的实际路径,而不是:

ENTRYPOINT ["docker-entrypoint.sh"]

使用

ENTRYPOINT ["./docker-entrypoint.sh"]

这告诉docker docker-entrypoint.sh文件位于应用程序的 root 文件夹中,如果到docker-entrypoint.sh的路径不同,也可以指定其他路径。 ,但请确保不要错过./文件路径定义的docker-entrypoint.sh前缀。

所以我的事看起来像这样:

RUN ["chmod", "+x", "docker-entrypoint.sh"]
ENTRYPOINT ["./docker-entrypoint.sh"]

仅此而已。

我希望这会有所帮助