编译Erlang 26源码构建Docker镜像遇权限拒绝问题求助
从源码编译Erlang 26构建Docker镜像时出现权限拒绝错误
问题详情
执行docker build .时触发如下错误:
=> ERROR [ 7/14] RUN /home/erl/otp_src_26.0.2/make 0.3s ------ > [ 7/14] RUN /home/erl/otp_src_26.0.2/make: #0 0.244 /bin/sh: 1: /home/erl/otp_src_26.0.2/make: Permission denied ------ Dockerfile:53 -------------------- 51 | 52 | 53 | >>> RUN /home/erl/otp_src_${ERLANG_VERSION}/make 54 | 55 | RUN /home/erl/otp_src_${ERLANG_VERSION}/make install && \ -------------------- ERROR: failed to solve: process "/bin/sh -c /home/erl/otp_src_${ERLANG_VERSION}/make" did not complete successfully: exit code: 126
已尝试切换root用户、使用make 4.2、给源码目录加777权限,均未解决;本地执行相同编译步骤可正常完成。之前通过erlang-solutions源安装Erlang,但该源无最新版本,希望修复当前源码编译方式的问题,原Dockerfile如下:
FROM ubuntu:22.04 ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 ENV ERLANG_VERSION 26.0.2 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -qq && \ apt-get install -y --no-install-recommends \ ca-certificates \ git \ gnupg \ inotify-tools \ make \ gcc \ libssl-dev \ libncurses-dev \ wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Install Erlang RUN wget -P /home/erl https://github.com/erlang/otp/releases/download/OTP-${ERLANG_VERSION}/otp_src_${ERLANG_VERSION}.tar.gz && \ tar -xf /home/erl/otp_src_${ERLANG_VERSION}.tar.gz -C /home/erl RUN /home/erl/otp_src_${ERLANG_VERSION}/configure RUN /home/erl/otp_src_${ERLANG_VERSION}/make RUN /home/erl/otp_src_${ERLANG_VERSION}/make install && \ rm -r /home/erl WORKDIR /app
问题根源
你错误地尝试执行Erlang源码目录下的make文件——这个文件并非可执行脚本,只是Makefile的配套文件(本身没有执行权限)。正确的编译方式是调用系统安装的make命令,进入源码目录后执行编译操作。
修复方案
基础修改版Dockerfile
调整编译和安装步骤,改用系统make命令并进入源码目录执行:
FROM ubuntu:22.04 ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 ENV ERLANG_VERSION 26.0.2 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -qq && \ apt-get install -y --no-install-recommends \ ca-certificates \ git \ gnupg \ inotify-tools \ make \ gcc \ libssl-dev \ libncurses-dev \ wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Install Erlang RUN wget -P /home/erl https://github.com/erlang/otp/releases/download/OTP-${ERLANG_VERSION}/otp_src_${ERLANG_VERSION}.tar.gz && \ tar -xf /home/erl/otp_src_${ERLANG_VERSION}.tar.gz -C /home/erl RUN cd /home/erl/otp_src_${ERLANG_VERSION} && ./configure RUN cd /home/erl/otp_src_${ERLANG_VERSION} && make RUN cd /home/erl/otp_src_${ERLANG_VERSION} && make install && \ rm -r /home/erl WORKDIR /app
优化版Dockerfile(减少镜像体积)
将多个RUN命令合并,减少镜像层数,同时提前清理下载的压缩包:
FROM ubuntu:22.04 ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 ENV ERLANG_VERSION 26.0.2 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -qq && \ apt-get install -y --no-install-recommends \ ca-certificates \ git \ gnupg \ inotify-tools \ make \ gcc \ libssl-dev \ libncurses-dev \ wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ # 下载并解压Erlang源码 wget -P /home/erl https://github.com/erlang/otp/releases/download/OTP-${ERLANG_VERSION}/otp_src_${ERLANG_VERSION}.tar.gz && \ tar -xf /home/erl/otp_src_${ERLANG_VERSION}.tar.gz -C /home/erl && \ rm /home/erl/otp_src_${ERLANG_VERSION}.tar.gz && \ # 编译安装Erlang cd /home/erl/otp_src_${ERLANG_VERSION} && \ ./configure && \ make && \ make install && \ # 清理源码目录 rm -r /home/erl WORKDIR /app
额外说明
- 无需手动给源码目录加执行权限,系统
make会自动读取目录内的Makefile完成编译。 - 合并RUN命令能减少镜像层数,避免中间层残留无用文件,有效降低镜像体积。
内容的提问来源于stack exchange,提问作者addUsername
相关产品推荐
相关产品推荐

