Ssh

後台的 SSH 隧道在 Docker 容器中立即斷開連接

  • May 23, 2020

我正在嘗試通過 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>``autossh``auth.log

先感謝您。

不確定您目前使用的是哪個 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.sh``ssh``docker built

因此,當您要建構映像時,只需執行bash build.sh.

引用自:https://serverfault.com/questions/1018415