【问题标题】:Command `source` doesn't work in Dockerfile命令`source`在Dockerfile中不起作用
【发布时间】:2018-06-15 00:51:28
【问题描述】:

我想构建我的图像,这是我的 Dockerfile:

FROM ubuntu:16.04

MAINTAINER 'hulei886@aliyun.com'

ENV PHANTOMJS_VERSION 2.1.1 
ENV PYTHON_VERSION 3.6.3

# install python3.6.3
RUN apt-get update \
 && apt-get install -y build-essential \
                       git \
                       curl \
                       libssl-dev \ 
                       zlib1g-dev \
                       libncurses5-dev \
                       libncursesw5-dev \
                       libreadline-dev \
                       libsqlite3-dev \

 && apt-get install -y libgdbm-dev \
                       libdb5.3-dev \
                       libbz2-dev \
                       libexpat1-dev \
                       liblzma-dev \ 
                       tk-dev \

 && cd ~ \

 && git clone https://github.com/pyenv/pyenv.git .pyenv \
 && echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc \
 && echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc \
 && echo 'eval "$(pyenv init -)"' >> ~/.bashrc \
 && source ~/.bashrc \

 && curl -L https://raw.githubusercontent.com/yyuu/pyenv- installer/master/bin/pyenv-installer | bash \

 && pyenv install PYTHON_VERSION \

 && pyenv global PYTHON_VERSION \
 && cd .. \
 CMD [python]

但是当我运行“docker build . -t [mytag]”时, git clone 命令没有克隆任何东西,这里是截图:

我需要帮助解决这个问题,谢谢!

【问题讨论】:

  • pyenf 文件夹存在吗?为什么在 'pyenf' 之前有一个点?
  • 在连接所有呼叫时,很难说出实际失败的原因。在你得到这个工作之前,你能不能把它们分成不同的行,看看哪一行实际失败了
  • source 是一个 bash 扩展;你的外壳不是 bash。请参阅the dot command 的 POSIX 规范,这是可移植的等效项。而且由于sh 不是 bash,所以这个问题不应该有bash标签; bash 在任何地方都没有涉及。

标签: bash docker sh


【解决方案1】:

错误信息很清楚:

/bin/sh: 1: source: not found

git clone 没有问题,但 source/bin/sh shell 中。您需要改用.(点)命令。

在编写 Dockerfile 时,最好使用/bin/sh shell 在容器中测试命令。

在您的情况下,在source 错误之后,还有其他错误:

  • curl URL 中的空格
  • env 变量使用错误:缺少$ 前缀
  • 没用的cd ~:只有WORKDIR instruction会在从生成的镜像运行容器时改变当前目录
  • CMD指令错误插入RUN指令

固定版本是:

[...]
  && git clone https://github.com/pyenv/pyenv.git .pyenv \
  && echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc \
  && echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc \
  && echo 'eval "$(pyenv init -)"' >> ~/.bashrc \
  && . ~/.bashrc \

  && curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash \

  && pyenv install $PYTHON_VERSION \
  && pyenv global $PYTHON_VERSION

WORKDIR /root
CMD [python]

【讨论】:

  • 这是正确的,您还需要将curl 之后的bash 命令替换为ubuntu 等效项。
  • 但是当我运行“docker run -it --rm ubuntu:16:04 /bin/sh”,并在我的dockerfile中逐步运行命令时,一切正常,没有任何问题
【解决方案2】:

你必须在 bash 中使用源代码替代。你可以做类似的事情

。一些文件

而不是

源文件

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多