我对 Docker 完全陌生,因此感谢您的耐心等待。
我正在寻找一种方法来部署具有相同镜像的多个容器,但是我需要向每个容器传递不同的配置(文件)?
现在,我的理解是,一旦构建了镜像,就会部署它,但对我来说,问题是我没有看到构建同一应用程序的多个镜像的意义,因为它只是配置容器之间的差异。
如果这是常态,那么我将不得不处理它,但是如果有其他方法,那么请让我摆脱痛苦! :)
谢谢!
最佳答案
我认为查看易于理解的示例可以为您提供最好的图片。
您想要做的是完全有效的,图像应该是您需要运行的任何东西,无需配置。
要生成配置,您可以:
a) 卷安装
在容器启动期间使用卷并挂载文件 docker run -v my.ini:/etc/mysql/my.ini percona
(与 docker-compose
类似)。
请注意,您可以随心所欲地重复此操作,因此将多个配置安装到您的 容器 中(即镜像的运行时版本)。
您将在运行容器之前在主机上创建这些配置,并且需要将这些文件与容器一起传送,这是这种方法的缺点(可移植性)
b) 基于入口点的配置(生成)
大多数高级 docker 镜像确实提供了一个复杂的所谓入口点,它使用您在启动镜像时传递的 ENV 变量,为您创建配置,例如 https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh
所以当你运行这个镜像时,你可以执行 docker run -e MYSQL_DATABASE=myapp percona
这将启动 percona 并为你创建数据库 percona。
这都是由
- 在此处添加入口点脚本 https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65
- 不要忘记在镜像构建期间复制脚本 https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L63
- 然后在镜像启动期间,您的 ENV 变量将导致触发:https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91
当然,你可以用它做任何你喜欢的事情。例如,这配置了一个通用的 portus 图像:https://github.com/EugenMayer/docker-rancher-extra-catalogs/blob/master/templates/registry-slim/11/docker-compose.yml 有这个入口点https://github.com/EugenMayer/docker-image-portus/blob/master/build/startup.sh
所以你看,入口点策略很常见也很强大,我想只要有可能就走这条路。
c) 派生图像
也许是为了“完整性”,图像派生策略,所以你有一个名为“myapp”的基础图像,并且你为安装 X 创建一个新图像
from myapp
COPY my.ini /etc/mysql/my.ini
COPY application.yml /var/app/config/application.yml
并将此图像称为 myapp:x - 显而易见的问题是,另一方面,您最终会拥有大量图像,而 a) 它更便携。
希望有帮助
关于docker - 多个 Docker 容器,相同的镜像,不同的配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38980547/