bash - 无法使用 sdkman 构建 dockerfile
问题描述
我对码头工人的概念完全陌生。我正在创建以下 Dockerfile 作为练习。
FROM ubuntu:latest
MAINTAINER kesarling
RUN apt update && apt upgrade -y
RUN apt install nginx curl zip unzip -y
RUN apt install openjdk-14-jdk python3 python3-doc clang golang-go gcc g++ -y
RUN curl -s "https://get.sdkman.io" | bash
RUN bash /root/.sdkman/bin/sdkman-init.sh
RUN sdk version
RUN yes | bash -c 'sdk install kotlin'
CMD [ "echo","The development environment has now been fully setup with C, C++, JAVA, Python3, Go and Kotlin" ]
我正在使用SDKMAN!安装Kotlin
。最初的问题是RUN bash /root/.sdkman/bin/sdkman-init.sh
,我没有使用 ,而是使用RUN source /root/.sdkman/bin/sdkman-init.sh
. 但是,它给出了错误提示source
not found。所以,我尝试使用RUN . /root/.sdkman/bin/sdkman-init.sh
,但它不起作用。但是,RUN bash /root/.sdkman/bin/sdkman-init.sh
似乎可以正常工作,因为 in 没有给出任何错误并尝试运行下一个命令。然而,码头工人然后给出错误说sdk: not found
我哪里错了?
应该注意的是,这些步骤对于我的主机分发(我正在运行 docker 的那个)来说就像魅力一样,它是Pop!_OS 20.04
解决方案
实际上脚本/root/.sdkman/bin/sdkman-init.sh
来源sdk
source 是 bash 的内置文件,而不是文件系统中某处的二进制文件。
source 命令在当前 shell 中执行文件。
每个 RUN 指令将在当前图像之上的新层中执行任何命令并提交结果。
生成的提交图像将用于 Dockerfile 中的下一步。
尝试这个:
FROM ubuntu:latest
MAINTAINER kesarling
RUN apt update && apt upgrade -y
RUN apt install nginx curl zip unzip -y
RUN apt install openjdk-14-jdk python3 python3-doc clang golang-go gcc g++ -y
RUN curl -s "https://get.sdkman.io" | bash
RUN /bin/bash -c "source /root/.sdkman/bin/sdkman-init.sh; sdk version; sdk install kotlin"
CMD [ "echo","The development environment has now been fully setup with C, C++, JAVA, Python3, Go and Kotlin" ]
推荐阅读
- azure - Azure Functions 高级计划允许的最大横向扩展实例
- python - 为什么numpy.linalg.eig不满足“矩阵点特征向量=特征值点特征向量”?
- c++ - 如何在给定问题中实现记忆
- angular - 升级到 EsLint:angular.json 出错(原理图:convert-tslint-to-eslint)
- firebase - 为什么我无法映射来自 FlutterFire 的 Cloud Firestore 的 snapshot.data?
- scala - 如何安装 Scala 2.12
- reactjs - 反转 API 调用中的数据顺序适用于 console.log
- javascript - js node.js中的窗口未定义错误
- laravel - 搜索动态数组索引 MongoDB
- sass - 将媒体查询传递给 SASS 混合时出错:错误:未定义的混合