在 Dockerfile 中无法使用 `source` 命令。

4

我希望构建我的镜像,这是我的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命令并没有克隆任何内容,这里附上屏幕截图:

enter image description here

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


pyenf文件夹存在吗?为什么在“pyenf”之前要加一个点? - Kilian
1
很难确定实际上哪里出了问题,因为您正在连接所有调用。在您解决此问题之前,您可以将它们拆分成单独的行以查看哪个特定行实际上失败了。 - timothyclifford
2
source 是一个 bash 扩展;你的 shell 不是 bash。请参阅 POSIX 规范中的 点命令,它是可移植的等效命令。由于 sh 不是 bash,因此在此问题上不应该有 bash 标签;bash 在任何地方都没有涉及。 - Charles Duffy
2个回答

5
错误信息很明确:
/bin/sh: 1: source: not found

没有使用/bin/sh shell下的git clone问题,但是在/bin/sh shell下使用source命令会出现问题。你需要使用.(点)命令代替。
在编写Dockerfile时,最好在使用/bin/sh shell的容器中测试命令。
在您的情况下,在source错误之后,还有其他错误:
  • curl URL中有空格
  • 环境变量使用错误:缺少$前缀
  • 无用的cd ~:只有WORKDIR指令将在从生成的镜像运行容器时更改当前目录
  • 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之后用Ubuntu等效命令替换bash命令。 - timothyclifford
但是当我运行“docker run -it --rm ubuntu:16:04 /bin/sh”,并逐步运行我的Dockerfile中的命令时,一切都很顺利,没有任何问题。 - hl79-james

4

在bash中,您必须使用替代源。您可以执行以下操作:

. somefile

而不是

source somefile


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