Ssh
後台的 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>``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
.