Dockerfile执行RUN cp重命名编译库文件提示找不到文件怎么办
解答
Docker 完全支持构建流程内的文件复制、重命名类操作,该报错和Docker本身能力无关,是编译产物的后缀判断错误导致的。
错误原因
.dylib 是 macOS 系统专属的动态库后缀,你使用的基础镜像是Linux发行版,Rust在Linux环境下编译输出的动态库默认后缀就是.so,根本不会生成.dylib格式的文件,cp命令自然找不到对应路径的文件。
你本地macOS环境编译Rust动态库才会产出.dylib后缀的文件,但容器内的编译过程是独立于宿主机系统的,不会沿用宿主机的编译产物命名规则。
修正方法
直接将复制命令的源文件改为Linux环境下实际生成的产物即可,修正后的Dockerfile片段如下:
RUN git clone https://gitlab.com/somelib/somelib.git RUN curl https://sh.rustup.rs -sSf | sh -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" RUN cargo build --release --manifest-path=somelib/Cargo.toml RUN cp somelib/target/release/libsomelib.so app/main/util/somelib.so
排查提示
如果后续再遇到类似构建阶段文件找不到的问题,可以在对应操作步骤前加一行查看目录内容的命令确认实际文件:
RUN ls -l somelib/target/release/
所有RUN指令执行时操作的都是构建中容器的内部文件系统,和你宿主机的操作系统类型没有关系,代码拉取、依赖编译、文件复制重命名的全流程都可以直接在Docker构建阶段完成,不需要提前在宿主机编译后再传入容器。
内容的提问来源于stack exchange,提问作者T. Rossi
相关产品推荐
相关产品推荐

