如何在前后台混合环境下编写Docker排版的yml文件

cpjpxq1n  于 2023-03-17  发布在  Docker
关注(0)|答案(2)|浏览(77)

我可以以某种方式处理Docker引擎,但无法处理Docker合成。我有两个Docker映像,分别是pg 13 ondebpyonol 8。一个最初来自postgresql 13映像,另一个来自OracleLinux 8,OracleLinux 8包含用于将数据写入pq 13数据库的Python脚本。我确认使用这些映像启动的2个容器能够协同工作,我指的是INSERT INTO SQL。脚本是从终端手动执行的。两个容器是用以下Docker命令创建的。

docker run --name pg13_1 -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d pg13ondeb
docker run --name client1 -it pyonol8 /bin/bash

(As您可以看到,第一个命令有**-d**选项,而第二个命令没有。)
现在,我想用docker compose命令创建一个pg 13 server容器和2client python容器,为了做到这一点,我写了一个如下的yml文件并执行了它。

version: "3"

services:
  pg13ondeb_1:
    image: pg13ondeb
    ports:
      - "5432:5432"
    networks:
      pg_net_1:
        ipv4_address: 172.20.0.2

  pyonol8_1:
    image: pyonol8
    networks:
      pg_net_1:
        ipv4_address: 172.20.0.11

  pyonol8_2:
    image: pyonol8
    networks:
      pg_net_1:
        ipv4_address: 172.20.0.12

networks:
  pg_net_1:
    name: app_net
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.20.0.0/24

然后我执行如下。

> docker compose up -d
[+] Running 4/4
⠿ Network app_net Created 0.0s
⠿ Container compose-pyonol8_1-1 Started 0.7s
⠿ Container compose-pyonol8_2-1 Started 0.8s
⠿ Container compose-pg13ondeb_1-1 Started 0.8s

看起来好像已经完成了,我用dicker ps -a查了一下,出现了三个container,但是用docker ps查的时候,只出现了compose-pg 13 ondeb_1-1,也就是说,另外两个应该启动的客户端实际上没有启动。
我的直觉是**-d**oprion导致了这个。有人知道如何在yml文件中解决这个问题吗?
谢谢你,

brccelvz

brccelvz1#

正如services:标签所暗示的那样,Compose更多地是围绕长时间运行的非交互式容器设计的。如果您混合了长时间运行的容器和临时容器,您应该只将长时间运行的容器放在docker-compose.yml文件中。

version: '3.8'
services:
  pg13ondeb_1:
    image: pg13ondeb
    ports:
      - "5432:5432"

networks:
  default:
    name: app_net  # defaults to <directoryname>_default

然后,您可以运行显式连接到该网络的临时容器。

docker run --rm -it --net app_net --name client1 pyonol8 \
  /bin/bash

如果映像的标准CMD确实有一个长时间运行的进程,并且您只是使用调试shell创建第二个临时容器,那么docker-compose run将给予一个主要基于Compose配置的容器,但忽略ports:并运行一些不同的命令。
一个二个一个一个
(在整个过程中,我大大简化了网络配置。Compose为您提供了一个名为default的网络,Docker将自动分配IP地址,因此在大多数情况下,您根本不需要在Compose文件中设置networks:。另请参阅Docker文档中的Networking in Compose。)

0h4hbjxa

0h4hbjxa2#

1.按docker ps -a查找container,按docker logs <container>检查pyonol8_1-3 container的日志。如果有错误,请修复它。
1.检查您的pyonol8入口点命令,它可能已经完成,并且在完成脚本后停止了contatiner。
1.添加正确的入口点来完成你的任务。因为当容器中的进程完成时容器会停止。例如,添加脚本来将数据写入你的数据库。但是当你的脚本完成时,你的容器会停止。如果你需要运行容器,你的入口点应该运行一直在运行的进程。

相关问题