python – 在运行时将pip需求添加到docker镜像

前端之家收集整理的这篇文章主要介绍了python – 在运行时将pip需求添加到docker镜像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我希望能够为自己的创建docker镜像添加一些额外的要求.我的策略是使用CMD命令从dockerfile构建映像,该命令将在运行时使用已安装的卷执行“pip install -r”命令.

这是我的dockerfile:

FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -y python-pip python-dev build-essential 
RUN pip install --upgrade pip

WORKDIR /root

CMD ["pip install -r /root/sourceCode/requirements.txt"]

有了dockerfile我构建了图像:

sudo docker build -t test .

最后我尝试使用此命令附加我的新需求:

sudo docker run -v $(pwd)/sourceCode:/root/sourceCode -it test /bin/bash

我的本地文件夹“sourceCode”包含一个有效的requirements.txt文件(它只包含一行值为“gunicorn”).
当我收到提示时,我可以看到需求文件存在,但是如果我执行pip freeze命令,则不会列出gunicorn包.

为什么requirements.txt文件已正确附加但pip命令无法正常工作?

最佳答案
TLDR

pip命令没有运行,因为你告诉Docker改为运行/ bin / bash.

docker run -v $(pwd)/sourceCode:/root/sourceCode -it test /bin/bash
                                                              ^
                                                             here

更长的解释

容器的默认ENTRYPOINT是/ bin / sh -c.你没有在Dockerfile中覆盖它,所以它仍然存在.默认的CMD指令可能没什么.你会在Dockerfile中覆盖它.运行时(为简洁起见忽略音量)

docker run -it test

实际在容器内执行的是

/bin/sh -c pip install -r /root/sourceCode/requirements.txt

很简单,看起来它会在你启动容器时运行pip.

现在让我们看一下用于启动容器的命令(同样,忽略卷)

docker run -v -it test /bin/bash

实际在容器内执行的是

/bin/sh -c /bin/bash

您在Dockerfile中指定的CMD参数将被您在命令行中指定的COMMAND覆盖.回想一下,docker运行@L_301_0@

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

进一步阅读

> This answer对CMD和ENTRYPOINT指令的作用有一个非常重要的解释

The ENTRYPOINT specifies a command that will always be executed when the container starts.

The CMD specifies arguments that will be fed to the ENTRYPOINT.

>这个blog post关于ENTRYPOINT和CMD指令之间的区别,值得一读.

猜你在找的Docker相关文章