【问题标题】:Keep a bash script running when running a Docker container运行 Docker 容器时保持 bash 脚本运行
【发布时间】:2021-09-16 14:21:52
【问题描述】:

我正在尝试从 Docker 容器内部建立 SSH 隧道连接。

我创建了一个允许连接的简短 shh-tunnel.sh 脚本:

ssh-tunnel.sh

ssh -4 -q -f -T -M -N -L 127.0.0.1:5433:credentials:more_credentials USER@HOST

然后我从 .Dockerfile 内部运行它,如下所示:

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y -qq python3 python3-pip openssh-client

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y postgresql postgresql-contrib

COPY ssh-tunnel.sh .

(other things ...)

RUN chmod u+x ./ssh-tunnel.sh 
CMD ./ssh-tunnel.sh

当我运行 docker build 时,一切看起来都很好。 我的问题是......当我运行 docker run 时如何保持连接建立?

【问题讨论】:

  • 没有看到 ssh-tunnel 脚本很难看到发生了什么,所以如果可以的话,请分享。你没有说当你运行容器时实际发生了什么,但我猜你已经尝试过这个并且它退出了。如果您不介意浪费几个处理器周期,可以在脚本末尾添加 top
  • 嗨@SoftwareEngineer,谢谢。现在我更新了问题

标签: docker ssh-tunnel docker-build docker-run


【解决方案1】:

从命令行中删除 -f。来自ssh 手册页:

 -f      Requests ssh to go to background just before command execution...

当不再有前台进程时,Docker 假定您的容器已经完成。如果您的命令退出进入后台,Docker 会清理容器。


其次,你对-L 的论点看起来有点古怪。端口转发的格式为-L <local_port>:<remote_address>:<remote_port>127.0.0.1:5433:credentials:more_credentials 应该会产生如下错误:

Bad local forwarding specification '127.0.0.1:5433:credentials:more_credentials'

你也想解决这个问题。

【讨论】:

  • 谢谢,我做到了,但还是没有。
  • 当您说“仍然没有”时,究竟发生了什么?您收到错误消息吗?还有什么?
  • 与 Docker 中的其他地方一样,端口转发需要侦听特殊的 0.0.0.0 “所有接口”地址才能从其容器外部访问;这不是ssh -L 的默认值。您需要指定类似-L 0.0.0.0:5432:credentials:5432 的内容。这里可以使用“普通”端口号,因为每个容器都在隔离的网络空间中运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多