<p>我认为看一些容易理解的例子可以给你最好的印象</p>
<p>您想要做的是完全有效的,映像应该是您需要运行的任何东西,而不需要配置</p>
<p>要生成配置,您可以:</p>
<hr/>
<h2>a) 卷装载</h2>
<p>在容器启动<code>docker run -v my.ini:/etc/mysql/my.ini percona</code>(与<code>docker-compose</code>类似)期间使用卷并装载文件。
请注意,您可以随时重复此操作,因此将多个配置装载到您的<strong>容器中(因此映像的运行时版本)。
在运行容器之前,您将在主机上创建这些配置,并且需要随容器一起提供这些文件,这是这种方法的缺点(可移植性)</p>
<h2>b) 基于入口点的配置(生成)</h2>
<p>大多数高级docker映像确实提供了一个复杂的所谓入口点,它使用启动映像时传递的ENV变量,为您创建配置,如<a href="https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh" rel="noreferrer">https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh</a></p>
<p>因此,当您运行此映像时,您可以执行<code>docker run -e MYSQL_DATABASE=myapp percona</code>,这将启动percona并为您创建数据库percona。
这一切都是由我们自己完成的</p>
<ol>
<li>在此处添加入口点脚本<a href="https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65" rel="noreferrer">https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65</a></li>
<li>不要忘记在映像生成期间复制脚本<a href="https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L63" rel="noreferrer">https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L63</a></li>
<li>然后,在映像启动期间,您的ENV变量将导致触发:<a href="https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91" rel="noreferrer">https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91</a></li>
</ol>
<p>当然,你可以用这个做任何你喜欢的事情。例如,这将配置一个通用端口映像:<a href="https://github.com/EugenMayer/docker-rancher-extra-catalogs/blob/master/templates/registry-slim/11/docker-compose.yml" rel="noreferrer">https://github.com/EugenMayer/docker-rancher-extra-catalogs/blob/master/templates/registry-slim/11/docker-compose.yml</a>
哪个有这个入口点<a href="https://github.com/EugenMayer/docker-image-portus/blob/master/build/startup.sh" rel="noreferrer">https://github.com/EugenMayer/docker-image-portus/blob/master/build/startup.sh</a></p>
<p>所以你看,入口点策略非常普遍,非常强大,我想只要你能,我就走这条路</p>
<h2>c) 派生图像</h2>
<p>可能是为了“完整性”,图像衍生策略,因此您有一个名为“myapp”的基础图像,在安装X时您创建一个新图像</p>
<pre><code>from myapp
COPY my.ini /etc/mysql/my.ini
COPY application.yml /var/app/config/application.yml
</code></pre>
<p>把这张图片称为myapp:x——最明显的问题是,你最终会有很多图片,另一方面,与a)相比,它更便于携带</p>
<p>希望有帮助</p>