后台的 SSH 隧道在 Docker 容器中立即断开连接

后台的 SSH 隧道在 Docker 容器中立即断开连接

我正在尝试通过 SSH 隧道将在 Docker 容器中运行的应用程序连接到数据库。我的 Dockerfile 如下所示:

# Alpine, PHP7.4, Nginx
FROM richarvey/nginx-php-fpm:1.9.1
EXPOSE 8080

ENV WEBROOT /var/www/html/public/

RUN docker-php-ext-install tokenizer xml pcntl

RUN echo "@community http://dl-4.alpinelinux.org/alpine/v3.6/community/" >> /etc/apk/repositories \
    && apk add --update autossh@community \
    && rm -rf /var/lib/apt/lists/*

COPY . /var/www/html/

RUN chmod 600 /ssh_key
RUN ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=5 -o ServerAliveCountMax=1 -i /ssh_key -fN -4 -L 3317:127.0.0.1:3306 user@host

RUN php artisan migrate --force

构建图像时(docker build -t project .)与数据库的连接(来自迁移)失败,并且来自服务器的身份验证日志为:

May 23 21:18:04 ultron sshd[3680]: pam_unix(sshd:session): session opened for user <user> by (uid=0)
May 23 21:18:04 ultron systemd-logind[468]: New session 126 of user <user>.
May 23 21:18:05 ultron sshd[3680]: pam_unix(sshd:session): session closed for user <user>
May 23 21:18:05 ultron systemd-logind[468]: Session 126 logged out. Waiting for processes to exit.
May 23 21:18:05 ultron systemd-logind[468]: Removed session 126.

我的本地计算机上的隧道和数据库连接工作正常,此外,如果我不将命令ssh放在后台(-f标志),它就不会断开连接,但当然,如果没有处理,Dockerfile 的其余部分也不会断开连接。

我尝试使用或将ssh命令放在独立的屏幕上,但使用这两个“替代方案”它甚至无法连接到主机(服务器上的 没有接收 ssh 连接)。screen -dm <ssh comand>autosshauth.log

先感谢您。

答案1

不确定你当前使用的是哪个 Docker 版本。我创建了一个类似的 Dockerfile

FROM debian:latest
RUN nohup sh -c "sleep 5|touch test|echo created" &
RUN echo 5
RUN sleep 10
RUN echo 10

并且它也失败了,没有创建文件,这是输出:

Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM debian:latest
 ---> 5971ee6076a0
Step 2/5 : RUN nohup sh -c "sleep 5|touch test|echo created" &
 ---> Running in e4a12097c5d4
Removing intermediate container e4a12097c5d4
 ---> 19c7f0299f63
Step 3/5 : RUN echo 5
 ---> Running in 6320537fd71c
5
Removing intermediate container 6320537fd71c
 ---> f57fd8f76a8c
Step 4/5 : RUN sleep 10
 ---> Running in a0e51201821f
Removing intermediate container a0e51201821f
 ---> 536fab968b90
Step 5/5 : RUN echo 10
 ---> Running in 6cbe27a02e83
10
Removing intermediate container 6cbe27a02e83
 ---> 79090270d8dc
Successfully built 79090270d8dc

日志是非常重要的信息。

Removing intermediate container e4a12097c5d4

Docker 镜像有一个非常重要的概念叫做:镜像层。它有助于减少重复工作并减小镜像大小。这意味着 Docker 构建可能会在任何时候停止并创建中间容器和镜像。这就是您的脚本无法工作的原因,因为每次“运行”,Docker 都会在进入下一行之前停止并清理任何剩余的进程。

更好的方法是,如果您希望更简单,请创建一个Makefile,或者一个脚本,然后将命令移到此文件的开头,然后将放入其中。build.shsshdocker built

因此,当您想要构建图像时,只需运行bash build.sh

相关内容