在OpenJDK Docker镜像中安装Rust的Dockerfile编写问题
解决Docker中同时运行Rust测试与Java服务的问题
问题背景
我正在编写Dockerfile以运行Rust测试套件,该套件需要一个Jar包在独立端口运行。已将Jar包下载到项目中,希望基于openjdk:latest镜像同时安装Rust,先启动Jar包再用cargo运行测试。
当前Dockerfile内容:
# Start with java FROM openjdk:latest # Add rust RUN <one line command to download rust> # Install production dependencies and build a release artifact. RUN cargo build --release # Start chromedriver, geckodriver, and selenium standalone binary RUN ./thirtyfour/tests/binaries_and_jars/chromedriver RUN ./thirtyfour/tests/binaries_and_jars/geckodriver RUN java -jar ./thirtyfour/tests/binaries_and_jars/selenium.jar standalone --port 1234 # Run the tests RUN cargo test
使用官网curl命令安装Rust时,即使传递参数仍会弹出确认提示:
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable --default-host x86_64-unknown-linux-gnu --profile default
需要以下任一解决方案:
- 一键安装Rust的命令
- 基于Rust镜像一键安装Java的命令
解决方案1:在openjdk镜像中无交互安装Rust
添加-y参数即可跳过安装确认提示,同时需配置cargo环境变量确保后续命令可直接调用:
# Add rust RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain stable --default-host x86_64-unknown-linux-gnu --profile default -y && \ echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
注意:原Dockerfile中用RUN单独启动服务会导致容器阻塞在服务启动步骤,后续cargo test无法执行,需将服务后台启动并等待就绪后再运行测试:
# 启动服务并运行测试 RUN ./thirtyfour/tests/binaries_and_jars/chromedriver & \ ./thirtyfour/tests/binaries_and_jars/geckodriver & \ java -jar ./thirtyfour/tests/binaries_and_jars/selenium.jar standalone --port 1234 & \ sleep 10 && cargo test
sleep 10用于预留服务启动时间,可根据实际情况调整时长。
解决方案2:基于Rust镜像安装Java
若选择从rust:latest镜像构建,可通过以下命令一键安装OpenJDK:
FROM rust:latest # 安装OpenJDK RUN apt-get update && apt-get install -y openjdk-17-jdk && apt-get clean
后续服务启动与测试的逻辑同解决方案1一致。
内容的提问来源于stack exchange,提问作者Benjamin Peinhardt
相关产品推荐
相关产品推荐

