Docker安装mysql-devel后文件为符号链接而非二进制文件的问题
解决AWS Lambda Ruby部署中MySQL库符号链接的问题
嘿,先给你吃个定心丸——你看到的这些符号链接是完全正常的,Linux系统里动态链接库的标准组织方式就是这样的!
你看ls -l的输出里,libmysqlclient.so.18.0.0是实际的二进制文件,其他.so后缀的链接都是用来做版本兼容的:比如程序编译时找libmysqlclient.so,系统会通过链接指向当前默认的版本(这里是18.0.0);mysql_config55是指向mysql_config的链接,也是为了兼容不同版本的调用命令。所以这个符号链接的情况不是导致Lambda测试失败的原因。
那问题可能出在哪呢?大概率是Lambda的运行环境里缺少必要的MySQL依赖,或者你的mysql2 Gem没有在Lambda兼容的环境下正确编译。下面给你几个具体的解决步骤:
1. 确保mysql2 Gem在Lambda构建环境下编译
Lambda的运行环境和本地环境不同,必须在和Lambda兼容的构建镜像里编译Gem,这样才能保证依赖能正确加载。修改你的Dockerfile,添加Gem安装步骤:
# Start with AWS lambda ruby environment FROM lambci/lambda:build-ruby2.5 RUN yum -y install mysql-devel RUN gem update bundler WORKDIR /var/task # 先复制Gemfile和Gemfile.lock,利用Docker缓存优化构建速度 COPY Gemfile Gemfile.lock ./ # 用--deployment参数把Gems安装到vendor/bundle目录,方便后续打包 RUN bundle install --deployment # 再复制你的应用代码 COPY . . CMD "/bin/bash"
2. 打包必要的MySQL动态库到部署包
Lambda的基础运行镜像(lambci/lambda:ruby2.5)默认不包含MySQL的动态库,所以需要把实际的库文件复制到你的部署包里,并配置环境变量让Lambda能找到它:
在Dockerfile里添加以下步骤:
# 创建lib目录存放动态库 RUN mkdir -p /var/task/lib # 复制实际的二进制库文件 RUN cp /usr/lib64/mysql/libmysqlclient.so.18.0.0 /var/task/lib/ # 创建必要的符号链接,保证gem能找到对应的库文件名 RUN ln -s /var/task/lib/libmysqlclient.so.18.0.0 /var/task/lib/libmysqlclient.so.18 RUN ln -s /var/task/lib/libmysqlclient.so.18 /var/task/lib/libmysqlclient.so
然后在Lambda函数的配置页面里,添加环境变量:LD_LIBRARY_PATH=/var/task/lib
3. 验证部署包内容
构建容器后进入容器,检查以下内容:
vendor/bundle/ruby/2.5.0/gems/mysql2-xxx目录下是否有编译好的扩展文件/var/task/lib目录下是否包含libmysqlclient.so.18.0.0以及对应的符号链接
完成这些步骤后,重新打包部署到Lambda,应该就能解决测试失败的问题了。
内容的提问来源于stack exchange,提问作者Steven Aguilar
相关产品推荐
相关产品推荐

