在docker-compose.yml中传递参数引发错误,但在docker run中不会

53次阅读
没有评论

问题描述

在尝试将以下docker run命令转换为docker-compose.yml文件时遇到了问题:

docker run -d -p 5434:5432 --name postgres-2 livingdocs/postgres:14.4 standby -d "host=host.docker.internal port=5433 user=postgres target_session_attrs=read-write"

这个命令能够正常运行,但当他尝试将其转换为docker-compose.yml时,出现了问题。他已经尝试过在线转换工具和约300种变体,但无法使其与docker run的效果相同。

解决方案

请注意以下操作可能涉及版本差异,建议在操作前进行备份。

解决方案

问题出在你的docker-compose.yml中,你在设置entrypoint时,却没有在docker run命令中使用--entrypoint选项。此外,你还删除了调用中的-d选项,而且你在docker-compose.yml中将剩余的选项作为单独的参数传递,而不是像在docker run中使用的单一字符串。

将你的docker run命令转换为等效的docker-compose.yml,可以如下操作:

version: '3'
services:
  postgres-2:
    image: livingdocs/postgres:14.4
    container_name: postgres-SLAVE
    ports:
      - "5434:5432"
    command:
      - standby
      - -d
      - "host=host.docker.internal port=5433 user=postgres target_session_attrs=read-write"

在上面的示例中,我们定义了一个名为postgres-2的服务,使用了与你的docker run命令等效的命令参数列表。

另外,你可以注意到在上面的示例中,我们没有包含entrypoint属性和volumes属性,因为这些在你的docker run命令中没有使用到。

优化方案

另外,你还可以优化你的docker-compose.yml,将命令参数使用一个字符串来传递,这更接近你在docker run命令中的做法。以下是优化后的示例:

version: '3'
services:
  postgres-2:
    image: livingdocs/postgres:14.4
    container_name: postgres-SLAVE
    ports:
      - "5434:5432"
    command: "standby -d 'host=host.docker.internal port=5433 user=postgres target_session_attrs=read-write'"

在这个示例中,我们将所有参数作为一个单一的字符串传递给command属性,与你在docker run中使用的方式更为类似。

总结

通过适当调整docker-compose.yml中的command属性,你可以实现与docker run相同的效果,确保传递的参数正确解析并执行。

请注意,根据你使用的Docker Compose版本,一些特性和选项可能会有所不同。如果出现问题,请参考适用于你的版本的官方文档或社区资源。

正文完