我有一个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.
请问有人对此提供帮助!
答案 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"]
仅此而已。
我希望这会有所帮助