docker-compose - 什么用于构建,什么用于运行时?

docker-compose - what is for build, and what is for runtime?

我正在将应用程序从 Docker 中的 运行(使用 docker-compose up)迁移到 Kubernetes。我们仍在使用 docker-compose.yml 构建图像。

我知道服务的一些配置设置用于构建,一些用于运行时 (docker-compose up)。所以,我想删除那些不会在 Kubernetes 环境中使用的设置。

认为 我正在找到要删除的正确设置,但我似乎找不到确定的列表,或者每个设置是针对构建还是运行时(例如docker-compose environment 的文档只是说“添加环境变量”。

这是我的运行时 (docker-compose up) 设置列表,如果我只是使用 docker-compose 进行构建,我认为删除这些设置是安全的。

验证此列表或指向某处文档的指针会有所帮助。

所以,实际上,我需要的是每个服务的 imagebuild?这样对吗?谢谢。

这些设置中的所有 都是run-time 设置。唯一的 build-time 设置是 build: 块中的内容和 image: 名称。

话虽如此,可以在 Docker 文件中指定其中的一些内容。 Dockerfile EXPOSECMDENV 指令为相应的 Compose 设置提供默认值。如果你有一个有用的默认命令,或者一个 environment-variable 设置,无论你 运行 容器在哪里(例如,path-related 变量),在 Docker 文件中设置它们。

Compose 文件中的

expose: 几乎什么都不做,删除它总是安全的。您通常不需要覆盖 container_name:。大多数 Compose 应用程序只需要 default 网络,您通常可以删除 docker-compose.yml 文件中的所有 networks: 块; Kubernetes 在任何情况下都不支持多个隔离网络。

restart:environment:command: 有 Kubernetes 等价物;请参阅 Pod API 参考。与 Compose 容器不同,Pods 默认为 restartPolicy: Always。请注意,Kubernetes command: 覆盖了图像的 ENTRYPOINT 和 Kubernetes args:CMD;该术语与 Docker 略有不同。您可以合理地需要 environment: 设置来指向诸如数据库主机名之类的东西,这些东西在 Kubernetes 中会有所不同。

depends_on: 在 Kubernetes 中不以任何形式存在。在 Compose 中,它最重要的作用是确保存在其他一些主机名;在 Kubernetes 中,您可以通过创建相关服务来获得这种效果。与 几乎相同,您需要手动确保依赖项在 Kubernetes 中可用,或者容忍它不可用。

init: 在 Kubernetes 中也不存在。如果您需要一个 init 进程作为容器中的进程 1,请在您的映像中安装类似 tini 的东西。

volumes:是这里最复杂的一个。我已经看到了它的几种用途:

  • 如果 volumes: 从主机系统注入配置文件,请将其放入 ConfigMap 并将其挂载到您的部署规范中。
  • 如果 volumes: 保留日志文件,请考虑重新配置您的应用程序以改为记录到标准输出。如果您做不到这一点,则需要与 DevOps 工程师合作,找出如何从您的容器中提取日志。
  • 如果 volumes: 保存数据库数据等持久数据,运行 您的容器作为 StatefulSet;每个副本都将获得自己的具有 cluster-managed 存储空间的 PersistentVolumeClaim。
  • 如果volumes:注入您的应用程序代码或库,请将其删除;代码应该打包在镜像中。

有像 Kompose 这样的工具可以尝试将 docker-compose.yml 文件转换为 Kubernetes 清单,但是有很多极端情况(例如 ConfigMaps),我建议使用这些作为起点,而不是假设它将成功转换。