通过 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
标志在这里没有多大意义,因为不会预先安装包。升级包就像重建图像一样简单
- 通过减少 Dockerfile 中
RUN
的数量来减少图像的层数是一种可取的做法,您可以在 best practice
我有这个 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
标志在这里没有多大意义,因为不会预先安装包。升级包就像重建图像一样简单 - 通过减少 Dockerfile 中
RUN
的数量来减少图像的层数是一种可取的做法,您可以在 best practice