我对docker概念完全陌生。我正在创建以下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 did not work。但是,RUN bash /root/.sdkman/bin/sdkman-init.sh seems可以正常工作,因为它不会给出任何错误,并尝试运行下一个命令。但是, docker 然后给出错误信息sdk: not found
我要去哪里错了?

应当注意,这些步骤对于Pop!_OS 20.04的主机分发版(运行docker的主机)来说就像是魅​​力

最佳答案

实际上,脚本/root/.sdkman/bin/sdkman-init.shsdk的来源

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" ]

08-28 10:04