/bin/sh: 1: ./configure: 找不到文件或目录 - dockerfile

16

我需要为Apache服务器安装Cosign过滤器。

我需要使用来自Confluence的cosign-filter,但是当我的安装运行./configure时,它会抛出错误:

ERROR: Unknown instruction: --ENABLE-APACHE2=/PATH/TO/APACHE2/BIN/APXS

然后我发现这个cosign过滤器的安装与Github存储库相关联,因为我在Docker容器中使用ubuntu16.04,所以它对我很有用。但是,在此安装中,我遇到了一个autoconf的问题,因此当他运行RUN autoconf时,会引发此错误:

autoconf: error: no input file
ERROR: Service 'web' failed to build: The command '/bin/sh -c autoconf' returned a non-zero code: 1

当他输入 RUN ./configure --enable-apache2= which apx 时,会出现第二个错误,错误信息如下:

Step 19/35 : RUN ./configure --enable-apache2=`which apxs`
 ---> Running in 1e9f870df22f
/bin/sh: 1: ./configure: not found
ERROR: Service 'web' failed to build: The command '/bin/sh -c ./configure --enable-apache2=`which apxs`' returned a non-zero code: 127

Dockerfile配置:

FROM ubuntu:16.04
FROM python:3.5
ENV PYTHONUNBUFFERED 1

RUN cat /etc/passwd
RUN cat /etc/group

RUN apt-get update && apt-get install -y \
    apache2 \
    apache2-dev \
    libapache2-mod-wsgi-py3 \
    autoconf \
    libssl-dev
RUN apt-get install -y openssl
RUN mkdir /var/run/sshd

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

# The Umich IAM copy of Cosign includes Apache 2.4 support
RUN wget https://github.com/umich-iam/cosign/archive/master.tar.gz
RUN tar xfz master.tar.gz
RUN cd cosign-master
RUN autoconf
RUN ./configure --enable-apache2=`which apxs`
RUN make
RUN make isntall
RUN mkdir -p /var/cosign/filter
RUN chown www-data:www-data /var/cosign/filter

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code

EXPOSE 80


# Update the default apache site with the config we created.
COPY 000-default.conf /etc/apache2/sites-enabled/000-default.conf

RUN chown -R root:www-data /var/www
RUN chmod u+rwx,g+rx,o+rx /var/www
RUN find /var/www -type d -exec chmod u+rwx,g+rx,o+rx {} +
RUN find /var/www -type f -exec chmod u+rw,g+rw,o+r {} +

#essentially: CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
CMD ["/tmp/start.sh"]

那么有没有方法可以修复这个问题,以便我可以安装和配置这个过滤器呢?谢谢。

1个回答

27

Dockerfile 文件中,除了 FROM 指令外的每个指令都会为其运行一个新的容器,因此

RUN cd cosign-master
RUN autoconf
RUN ./configure --enable-apache2=`which apxs`

将在三个独立的容器中执行三个命令,因此cd cosign-master 命令不能更改下一个容器的PWD环境变量。 您可以使用绝对路径或在一个容器中执行相关命令,这意味着在一个指令内。

RUN cd cosign-master \
    && autoconf \
    && ./configure --enable-apache2=`which apxs` \
    && make \
    && make install

提示:

  1. 应该使用一个指令来执行多个命令,以减少层数,因为每个指令会生成一个新的层。
  2. 应该清理中间文件或软件,以减小最终镜像的大小。

例如:

FROM ubuntu:16.04
FROM python:3.5

ENV PYTHONUNBUFFERED=1 \
    APACHE_RUN_USER=www-data \
    APACHE_RUN_GROUP=www-data \
    APACHE_LOG_DIR=/var/log/apache2 \
    APACHE_LOCK_DIR=/var/lock/apache2 \
    APACHE_PID_FILE=/var/run/apache2.pid

RUN set -ex \
    && cat /etc/passwd \
    && cat /etc/group \
    && apt-get update \
    && export COMPILE_TOOLS="autoconf libssl-dev openssl" \
    && apt-get install -y \
               apache2 \
               apache2-dev \
               libapache2-mod-wsgi-py3 \
               ${COMPILE_TOOLS} \
    && wget https://github.com/umich-iam/cosign/archive/master.tar.gz -O /tmp/cosign-master.tar.gz \
    && tar xfz /tmp/cosign-master.tar.gz -C=/tmp \
    && cd /tmp/cosign-master \
    && autoconf \
    && ./configure --enable-apache2=$(which apxs) \
    && make \
    && make install \
    && mkdir -p /var/cosign/filter \
    && chown www-data:www-data /var/cosign/filter \
    && apt-get purge -y ${COMPILE_TOOLS} \
    && rm -rf /var/lib/apt/lists/* \
              /tmp/cosign-master.tar.gz \
              /tmp/cosign-master/*

WORKDIR /code

# The Umich IAM copy of Cosign includes Apache 2.4 support
COPY requirements.txt /code/
COPY . /code
# Update the default apache site with the config we created.
COPY 000-default.conf /etc/apache2/sites-enabled/000-default.conf

RUN mkdir /var/run/sshd \
    && pip install -r requirements.txt \
    && chown -R root:www-data /var/www \
    && chmod u+rwx,g+rx,o+rx /var/www \
    && find /var/www -type d -exec chmod u+rwx,g+rx,o+rx {} + \
    && find /var/www -type f -exec chmod u+rw,g+rw,o+r {} +

EXPOSE 80

#essentially: CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
CMD ["/tmp/start.sh"]

这将会:

  1. 将您的图像层数从大约 35 减少到只有 9
  2. 极大地减小您的图像大小,可能仅为原始图像的 三分之一
  3. 可能有点难以阅读 :)

希望这可以帮助到您!


让人感到奇怪的是,很多教程都提倡像这里一样分开使用 RUN 命令:https://pythonspeed.com/articles/activate-conda-dockerfile/ - mLstudent33
教程中说道:“每个 RUN 都是一个新的 shell 会话”。 - mLstudent33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接