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 中找不到可执行文件”的主要内容,如果未能解决你的问题,请参考以下文章
CannotStartContainerError:API 错误(400):OCI 运行时创建失败:container_linux.go:348:导致启动容器进程
OCI 运行时执行失败:执行失败:(...)$PATH 中找不到可执行文件“:未知
Gitlab-runner dind 导致错误:作业失败(系统故障):来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:380: