目标
构建搭建hadoop所需要的openjdk环境docker镜像
dockerfile
FROM ubuntu:20.04
COPY ./openjdk-8u44-linux-x64.tar.gz /tmp/
RUN /bin/sh -c set -eux; \
mkdir -p /opt/java/openjdk; \
tar -zxf /tmp/openjdk-8u44-linux-x64.tar.gz --strip-components=1 -C /opt/java/openjdk/; \
rm -rf /tmp/openjdk-8u44-linux-x64.tar.gz
ENV JAVA_HOME=/opt/java/openjdk
ENV PATH=$PATH:$JAVA_HOME/bin
注: 宿主机 dockerfile 相同目录下有 openjdk 的包
命令解释
/bin/sh -c set -eux;
-
-c:这是 sh 的一个选项,表示它将执行紧接其后的字符串(即 `“set -eux; …”)作为命令。
-
set 是一个 Shell 内置命令,用来修改 Shell 的行为
-
-e(Exit immediately on error):当脚本中的任何一条命令返回非零状态(即失败)时,立即退出整个脚本。这确保了一旦有命令失败,Dockerfile 构建过程会立刻中断,不会继续执行。
-
-u(Treat unset variables as an error):如果使用了未定义的变量,Shell 会抛出错误并退出。这可以防止使用未定义的变量导致不预期的行为。
-
-x(Print each command before executing it):在执行每一条命令之前,都会将该命令输出到控制台。这有助于调试,方便看到每一步的执行过程。
tar -zxf --strip-components=1
--strip-components=1
: 去除解压后的一级目录
注意点
COPY
不会自动解压,
ADD`会自动解压- 在Dockerfile中,RUN 指令每执行一次就会生成一层。这也是为什么在Dockerfile中通常推荐将多个命令合并到一个 RUN 指令中,以减少镜像层数,从而提高构建效率和镜像的可移植性。
Build
doker build --no-cache -t name .
--no-cache
: Docker在构建镜像时不要使用缓存。默认情况下,Docker会尝试使用之前构建过程中创建的层作为缓存,以加速构建过程。这意味着只有当Dockerfile中的指令或文件发生了变化时,才会重新构建那些层。