docker - 多个 Docker 容器,相同的镜像,不同的配置

标签 docker containers

我对 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。 这都是由

完成的
  1. 在此处添加入口点脚本 https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65
  2. 不要忘记在镜像构建期间复制脚本 https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L63
  3. 然后在镜像启动期间,您的 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/

相关文章:

docker - Docker Daemon 和 Docker Engine 有什么区别?

c++ - 存储小型、固定大小、分层静态数据集的好方法是什么?

node.js - docker构建Dockerfile时如何缓存RUN npm install指令

css - HTML 网站向左移动

java - Java运行时需要判断对象的类型。设计不好?

node.js - 当 cpu 为 100% 时,为什么我的负载均衡器不重定向到可用的 ec2?

php - Docker compose 命令没有这样的文件

docker - 通过命令行(即非UI)为Docker镜像安装Delphi

docker - 将 ArangoDb 与 Docker mem_limit 结合使用

java - distroless java docker 镜像错误