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

Posted

技术标签:

【中文标题】Docker:OCI 运行时创建失败:container_linux.go:349:启动容器进程导致“exec:\\”java\\“:$PATH 中找不到可执行文件”【英文标题】:Docker: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"java\": executable file not found in $PATH"Docker:OCI 运行时创建失败:container_linux.go:349:启动容器进程导致“exec:\”java\“:$PATH 中找不到可执行文件” 【发布时间】:2020-08-22 15:44:08 【问题描述】:

我有一个与 Postgres 数据库配合使用的 Java Spring Boot 应用程序。我想对它们都使用 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 码头工人组成

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.

请任何人帮忙!

【问题讨论】:

您似乎拥有错误的权限。尝试以 sudo 运行 docker-compose 您正在尝试启动与 Oracle 客户端链接的可执行文件。你一定是做错了什么。 【参考方案1】:

在为 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“:$ 中找不到可执行文件 路径":未知

这是我修复它的方法

指定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"]

就是这样。

我希望这会有所帮助

【讨论】:

【参考方案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"]

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

我认为这是这个问题的真正原因,谢谢。

以上是关于Docker:OCI 运行时创建失败:container_linux.go:349:启动容器进程导致“exec:\”java\“:$PATH 中找不到可执行文件”的主要内容,如果未能解决你的问题,请参考以下文章

无法启动服务 web:OCI 运行时创建失败:

CannotStartContainerError:API 错误(400):OCI 运行时创建失败:container_linux.go:348:导致启动容器进程

OCI 运行时执行失败:执行失败:(...)$PATH 中找不到可执行文件“:未知

Gitlab-runner dind 导致错误:作业失败(系统故障):来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:380:

使用非root用户时,Docker节点权限被拒绝

无法将环境变量传递给 docker