通过 docker 运行 -it 执行命令时没有这样的文件或目录

No such file or directory when executing command via docker run -it

我有这个 Dockerfile(步骤基于 AWS 中的安装指南)

FROM amazon/aws-cli:latest

RUN yum install python37 -y

RUN curl -O https://bootstrap.pypa.io/get-pip.py

RUN python3 get-pip.py --user

RUN pip3 install awsebcli --upgrade --user

RUN echo 'export PATH=~/.local/bin:$PATH' >> ~/.bashrc

RUN source ~/.bashrc

ENTRYPOINT ["/bin/bash"]

当我使用 docker build -t eb-cli . 构建图像,然后在容器 docker run -it eb-cli 中使用 运行 eb --version 构建图像时,一切正常

bash-4.2# eb --version
EB CLI 3.20.3 (Python 3.7.1)

但是,当我 运行 命令直接作为 docker run -it eb-cli eb --version 时,它给我这个错误

/bin/bash: eb: No such file or directory

我认为这是 bash 配置文件的问题,但我无法弄清楚。

您的来源 .bashrc 将保留在来源层中,但不会应用于生成的容器。这实际上在这个答案中有更彻底的解释:

Each command runs a separate sub-shell, so the environment variables are not preserved and .bashrc is not sourced

来源:

您的一个解决方案是在容器的环境变量中设置 PATH,而不是将 ENTRYPOINT 设置为由您的基本映像设置的空白。

所以你可以用一张简单的图片作为结尾:

FROM amazon/aws-cli:latest

ENV PATH="/root/.local/bin:${PATH}"

RUN yum install python37 -y \
    && pip3 install awsebcli

ENTRYPOINT []

有了这个 Dockerfile,这里是生成的构建和 运行:

$ docker build . -t eb-cli -q
sha256:49c376d98fc2b35cf121b43dbaa96caf9e775b0cd236c1b76932e25c60b231bc
$ docker run eb-cli eb --version
EB CLI 3.20.3 (Python 3.7.1)

备注:

  • 您可以安装真正最新版本的 pip,正如您所做的那样,但不需要它,因为它已经捆绑在包中 python37
  • 使用 --user 标志为用户安装软件包确实是一个很好的做法,但是由于您 运行 将此命令设置为 root,因此没有实际意义这样做,最终
  • 拥有 --upgrade 标志在这里没有多大意义,因为不会预先安装包。升级包就像重建图像一样简单
  • 通过减少 DockerfileRUN 的数量来减少图像的层数是一种可取的做法,您可以在 best practice