<h3>TLDR</h3>
<p><code>pip</code>命令没有运行,因为您告诉Docker运行<code>/bin/bash</code>。在</p>
<pre><code>docker run -v $(pwd)/sourceCode:/root/sourceCode -it test /bin/bash
^
here
</code></pre>
<h3>更长的解释</h3>
<p>容器的默认<code>ENTRYPOINT</code>是<code>/bin/sh -c</code>。在Dockerfile中不覆盖它,所以它仍然存在。默认的<code>CMD</code>指令可能是空的。你可以在你的Dockerfile中覆盖它。运行<em>时(为简洁起见,请忽略音量)</em></p>
^{pr2}$
<p>在容器中实际执行的是</p>
<pre><code>/bin/sh -c pip install -r /root/sourceCode/requirements.txt
</code></pre>
<p>很直接,当您启动容器时,看起来它将运行<code>pip</code>。在</p>
<p>现在让我们看一下您用来启动容器的命令<em>(同样,忽略卷)</em></p>
<pre><code>docker run -v -it test /bin/bash
</code></pre>
<p>在容器中实际执行的是</p>
<pre><code>/bin/sh -c /bin/bash
</code></pre>
<p>您在Dockerfile中指定的<code>CMD</code>参数将被您在命令行中指定的<code>COMMAND</code>覆盖。回想一下<code>docker run</code><a href="https://docs.docker.com/engine/reference/run/" rel="nofollow noreferrer">command takes this form</a></p>
<pre><code>docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
</code></pre>
<h3>进一步阅读</h3>
<ol>
<li><p><a href="https://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile/34245657#34245657">This answer</a>对<code>CMD</code>和<code>ENTRYPOINT</code>指令的作用有一个非常切题的解释</p>
<blockquote>
<p>The <code>ENTRYPOINT</code> specifies a command that will always be executed when the container starts.</p>
<p>The <code>CMD</code> specifies arguments that will be fed to the <code>ENTRYPOINT</code>.</p>
</blockquote></li>
<li><p>这篇<a href="https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/" rel="nofollow noreferrer">blog post</a>关于<code>ENTRYPOINT</code>和<code>CMD</code>指令之间的区别,值得一读。</p></li>
</ol>