我正在尝试通过 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
先感谢您。
答案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.sh
ssh
docker built
因此,当您想要构建图像时,只需运行bash build.sh
。