mac+php5.3的docker-compose.yml分享

本文介绍了如何使用DockerCompose在版本3中部署Nginx和PHP-FPM服务,包括镜像选择、容器名称、卷挂载、环境变量设置等,确保两个服务间的通信和日志管理。
version: '3'
services: 
  nginx: 
    image: nginx:latest
    container_name: nginx-compose
    volumes:
      - ./wwwroot:/usr/share/nginx/html:rw
      - ./nginx/nginx/:/etc/nginx/:rw
      - ./log/nginx:/var/log/nginx:rw
    restart: always
    links:
      - php
    ports:
      - 80:80
  php:
    image: leleos/php-fpm:5.3
    restart: always
    volumes:
      - ./wwwroot:/usr/share/nginx/html:rw
      - ./php/log:/var/log/phplog:rw
    container_name: php-compose
    environment:
      NEW_UID: 1000
      NEW_GID: 1000

镜像:leleos/php-fpm

<think> 我们面对的问题是:在Docker Compose启动Spring应用时,出现`org.springframework.beans.factory.BeanCreationException`,嵌套异常为`java.lang.UnsatisfiedLinkError: no jniavdevice in java.library.path`。这个错误通常表明Java虚拟机在尝试加载本地库(JNI)时找不到对应的动态链接库(在这里是`jniavdevice`)。 ### 问题分析 - **jniavdevice**:这通常与音视频处理库有关,例如可能是FFmpeg或OpenCV等库的JNI绑定。 - **java.library.path**:Java在启动时会从`java.library.path`指定的路径中加载本地库。如果这个路径中没有包含所需的库文件,就会抛出此异常。 ### 解决方案 我们需要确保在Docker容器中: 1. 安装所需的本地库(例如FFmpeg)。 2. 将本地库所在的目录添加到`java.library.path`中,或者在启动Java应用时通过`-Djava.library.path`参数指定。 以下是通过Docker Compose解决此问题的完整步骤: #### 步骤1: 准备Dockerfile 在Dockerfile中,我们需要安装FFmpeg(假设`jniavdevice`是FFmpeg的一部分)并设置环境变量。 ```Dockerfile # 使用包含FFmpeg的基础镜像,或者自己安装 FROM openjdk:11-jdk # 安装FFmpeg RUN apt-get update && apt-get install -y ffmpeg # 设置环境变量,将FFmpeg的库路径添加到java.library.path ENV LD_LIBRARY_PATH=/usr/lib/jvm/java-11-openjdk-amd64/lib:/usr/lib/x86_64-linux-gnu:/usr/lib ENV JAVA_OPTS="-Djava.library.path=/usr/lib/x86_64-linux-gnu" # 复制应用JAR文件 COPY target/your-application.jar /app.jar # 设置启动命令 ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app.jar"] ``` **注意**: - 我们通过`apt-get install -y ffmpeg`安装了FFmpeg,它通常会将库文件安装在`/usr/lib/x86_64-linux-gnu`目录下。 - 我们设置`JAVA_OPTS`环境变量来指定`java.library.path`,确保Java能够找到FFmpeg的本地库。 - 同时,我们也设置了`LD_LIBRARY_PATH`,因为有些本地库可能依赖其他库,这个环境变量可以帮助系统找到这些依赖。 #### 步骤2: 准备docker-compose.yml 接下来,我们创建`docker-compose.yml`文件来定义服务。假设我们的应用依赖一个数据库(比如MySQL),我们可以这样配置: ```yaml version: &#39;3.8&#39; services: app: build: . ports: - "8080:8080" environment: # 可以在这里添加其他环境变量 SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb?useSSL=false SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: example depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: mydb volumes: - db_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password # 解决MySQL8.0的认证问题 volumes: db_data: ``` #### 步骤3: 构建并启动 在包含Dockerfile和docker-compose.yml的目录中执行以下命令: ```bash # 构建镜像 docker-compose build # 启动服务 docker-compose up -d ``` #### 步骤4: 验证 检查应用日志,确认是否解决了本地库加载问题: ```bash docker-compose logs app ``` 如果日志中没有再出现`java.lang.UnsatisfiedLinkError: no jniavdevice`,则问题已解决。 ### 备选方案:如果FFmpeg安装后仍然找不到库 有时,FFmpeg的库文件可能不在`/usr/lib/x86_64-linux-gnu`目录,我们可以通过以下命令查找: ```bash docker-compose exec app find / -name &#39;libavdevice.so&#39; 2>/dev/null ``` 找到路径后,修改Dockerfile中的`JAVA_OPTS`和`LD_LIBRARY_PATH`环境变量指向该路径。例如,如果找到的路径是`/usr/lib/libavdevice.so`,则: ```Dockerfile ENV LD_LIBRARY_PATH=/usr/lib/jvm/java-11-openjdk-amd64/lib:/usr/lib:/usr/lib64 ENV JAVA_OPTS="-Djava.library.path=/usr/lib" ``` ### 常见问题排查 1. **基础镜像问题**:确保使用的基础镜像包含GLIBC等基础库,因为FFmpeg依赖这些库。如果使用`alpine`镜像,需要安装额外的兼容库,建议使用Debian/Ubuntu为基础镜像。 2. **多阶段构建**:如果应用构建需要Maven,可以使用多阶段构建,但确保运行阶段的基础镜像安装了FFmpeg。 ### 相关问题 1. 如何在Docker中为Spring Boot应用配置FFmpeg? 2. 如何解决Java应用在Docker中的本地库加载问题? 3. 如何优化Docker镜像以减少体积同时包含FFmpeg? ### 参考 - [Spring Boot with JNI](https://spring.io/projects/spring-native) - [FFmpeg官方安装指南](https://ffmpeg.org/download.html) 通过以上步骤,应该能够解决`java.lang.UnsatisfiedLinkError: no jniavdevice in java.library.path`的问题,并成功启动Spring应用。 </think>### Docker Compose 环境下解决 Spring 应用启动报错 `UnsatisfiedLinkError: no jniavdevice` 的完整方案 该错误表明 Java 虚拟机 (JVM) 在尝试加载本地库 `jniavdevice` 时失败。这通常发生在使用音视频处理库 (如 FFmpeg) 的 Java 应用中。以下是详细的修复步骤: #### 解决方案:安装 FFmpeg 并配置本地库路径 ```bash # 1. 创建项目目录结构 mkdir -p spring-app/docker-config cd spring-app # 2. 创建 Dockerfile (安装 FFmpeg 和依赖库) cat > Dockerfile <<&#39;EOF&#39; FROM openjdk:17-jdk-slim # 安装 FFmpeg 和相关依赖(解决 jniavdevice 问题) RUN apt-get update && \ apt-get install -y --no-install-recommends \ ffmpeg \ libavdevice-dev \ libavfilter-dev \ libopus-dev \ libvpx-dev && \ rm -rf /var/lib/apt/lists/* # 设置环境变量指向 FFmpeg 库路径 ENV LD_LIBRARY_PATH=/usr/lib/jni:$LD_LIBRARY_PATH ENV JAVA_OPTS="-Djava.library.path=/usr/lib/jni" # 复制应用 JAR 文件 COPY target/your-app.jar /app.jar # 启动命令(添加参数确保加载本地库) ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app.jar"] EOF # 3. 创建 docker-compose.yml cat > docker-compose.yml <<&#39;EOF&#39; version: &#39;3.8&#39; services: app: build: . ports: - "8080:8080" volumes: - ./logs:/app/logs environment: # 设置额外的库路径 (按实际需要) LD_LIBRARY_PATH: "/usr/lib:/usr/lib/jni:$LD_LIBRARY_PATH" # 设置Java本地库路径 JAVA_OPTS: "-Djava.library.path=/usr/lib:/usr/lib/jni" depends_on: - db # 特权模式可能需要访问设备(如摄像头) privileged: true db: image: postgres:13 environment: POSTGRES_DB: appdb POSTGRES_USER: appuser POSTGRES_PASSWORD: secret volumes: - db-data:/var/lib/postgresql/data volumes: db-data: EOF # 4. 构建与启动 # 先构建应用(假设是Maven项目) mvn clean package -DskipTests # 构建Docker镜像 docker-compose build # 启动服务 docker-compose up -d # 5. 验证安装 docker-compose exec app ldd /usr/lib/jni/* | grep avdevice # 应显示FFmpeg库 docker-compose exec app java -XshowSettings:properties -version 2>&1 | grep library.path ``` #### 备选方案:直接复制本地库文件 如果上述方法无效,可能需要手动添加特定库文件: ```bash # 1. 在主机上查找库文件 sudo find / -name &#39;libavdevice*.so*&#39; 2>/dev/null # 2. 创建目录存放库文件 mkdir -p docker-config/libs # 3. 复制找到的库文件(示例路径) sudo cp /usr/lib/jni/libavdevice.so docker-config/libs/ # 4. 修改 Dockerfile cat >> Dockerfile <<&#39;EOF&#39; # 复制本地库文件 COPY docker-config/libs /usr/lib/jni # 设置库权限 RUN chmod 755 /usr/lib/jni/*.so EOF # 5. 重新构建并启动 docker-compose down docker-compose build --no-cache docker-compose up -d ``` #### 验证步骤 ```bash # 1. 检查容器日志 docker-compose logs -f app # 2. 进入容器检查库路径 docker-compose exec app bash > ls /usr/lib/jni # 应看到 libavdevice.so > echo $LD_LIBRARY_PATH # 应包含 /usr/lib/jni > echo $JAVA_OPTS # 应包含 -Djava.library.path=/usr/lib/jni # 3. 测试库加载 docker-compose exec app java -cp /app.jar your.package.TestLibraryLoad ``` #### 高级配置:JNI 调试 如果问题仍然存在,启用 JNI 调试: ```bash # 修改 docker-compose.yml environment: JAVA_OPTS: "-Djava.library.path=/usr/lib/jni -Xcheck:jni -verbose:jni" ``` #### 常见问题排查 ```bash # 1. 检查库依赖 docker-compose exec app ldd /usr/lib/jni/libavdevice.so # 2. 查看容器中的库路径 docker-compose exec app find / -name &#39;libavdevice*&#39; 2>/dev/null # 3. 验证库架构兼容性 docker-compose exec app file /usr/lib/jni/libavdevice.so # 应输出 ELF 64-bit LSB shared object, x86-64 # 4. 检查系统库 docker-compose exec app ldconfig -v | grep avdevice ``` #### 最佳实践建议 1. **基础镜像选择**: ```Dockerfile # 使用包含多媒体支持的镜像 FROM azul/zulu-openjdk:17.0-jre-headless-linux ``` 2. **多阶段构建优化**: ```Dockerfile # 第一阶段:构建环境 FROM ubuntu:22.04 as builder RUN apt-get update && apt-get install -y build-essential ffmpeg # 第二阶段:运行环境 FROM openjdk:17-jdk-slim COPY --from=builder /usr/lib/jni /usr/lib/jni ``` 3. **版本锁定**: ```Dockerfile # 明确指定FFmpeg版本 RUN apt-get install -y ffmpeg=7:5.1.2-* ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值