问题描述
在尝试将以下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版本,一些特性和选项可能会有所不同。如果出现问题,请参考适用于你的版本的官方文档或社区资源。