我希望能够为自己的创建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命令无法正常工作?
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运行command takes this form
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 theENTRYPOINT
.
>这个blog post关于ENTRYPOINT和CMD指令之间的区别,值得一读.