我有一个非常简单的docker-compose.yml文件:
version: '3'
services:
server:
build : .
ports:
- "4567:4567"
environment:
- ENDPOINT_PORT=4567
ssh:
build:
context: .
dockerfile: Dockerfile-ssh-service
ports:
- 22
depends_on:
- server
直到上周,这将为我的项目可靠地创建一个具有ssh容器和已构建容器的网络,该网络将彼此正确的端口以及主机上的正确端口绑定公开给您:
docker-compose --project-name project_name up --build -d --scale ssh=3
Names Ports Command
----- ----- -------
project_name_ssh_3 0.0.0.0:32774->22/tcp "/usr/sbin/sshd -D"
project_name_ssh_1 0.0.0.0:32775->22/tcp "/usr/sbin/sshd -D"
project_name_ssh_2 0.0.0.0:32776->22/tcp "/usr/sbin/sshd -D"
project_name_server_1 0.0.0.0:4567->4567/tcp "bundle exec scripts/boot.rb"
不幸的是,大约在上周,运行此命令的成功率已降至50%或更低。现在,对于大多数使用上述命令的尝试,compose都无法将project_name_server_1
添加到compose网络中,并且无法在主机上创建其侦听器。
Names Ports Command
----- ----- -------
project_name_ssh_2 0.0.0.0:32800->22/tcp "/usr/sbin/sshd -D"
project_name_ssh_3 0.0.0.0:32799->22/tcp "/usr/sbin/sshd -D"
project_name_ssh_1 0.0.0.0:32798->22/tcp "/usr/sbin/sshd -D"
project_name_server_1 "bundle exec scripts/boot.rb"
由于关于撰写文件或其构建的Dockerfile
的任何内容在上周或在该命令的运行之间都没有更改,因此我无所适从地解释了为何撰写有时会正确地创建网络,而不是其他人。
我在Windows上使用docker-compose在Mac上和我的一些同事也看到了相同的行为。
更新:
如果我在运行失败期间运行docker ps(dps是一个客户powershell函数,我将其作为powershell对象而不是表字符串返回docker ps输出)足够多的时间,我会得到奇怪的行为,即服务器映像首先使用侦听器运行,然后docker删除侦听器并创建其他容器,添加其侦听器并将侦听器从服务器容器中删除,然后再也不必费心将侦听器重新添加到服务器。
dps | ft names, ports, command
Names Ports Command
----- ----- -------
project_name_server_1 "bundle exec scripts/boot.rb"
dps | ft names, ports, command
Names Ports Command
----- ----- -------
project_name_ssh_2 "/usr/sbin/sshd -D"
project_name_ssh_3 "/usr/sbin/sshd -D"
project_name_ssh_1 "/usr/sbin/sshd -D"
project_name_server_1 0.0.0.0:4567->4567/tcp "bundle exec scripts/boot.rb"
dps | ft names, ports, command
Names Ports Command
----- ----- -------
project_name_ssh_2 "/usr/sbin/sshd -D"
project_name_ssh_3 "/usr/sbin/sshd -D"
project_name_ssh_1 "/usr/sbin/sshd -D"
project_name_server_1 "bundle exec scripts/boot.rb"
dps | ft names, ports, command
Names Ports Command
----- ----- -------
project_name_ssh_2 0.0.0.0:32867->22/tcp "/usr/sbin/sshd -D"
project_name_ssh_3 0.0.0.0:32869->22/tcp "/usr/sbin/sshd -D"
project_name_ssh_1 0.0.0.0:32868->22/tcp "/usr/sbin/sshd -D"
project_name_server_1 "bundle exec scripts/boot.rb"
该问题原来是代码scripts/boot.rb
的问题。
该脚本将执行,然后立即崩溃。当它崩溃时,由于某种原因,它将被从网络中删除。
当项目开始使用更可靠的脚本启动Web服务器时,此问题消失了。