mysql - 如何完成从本地开发 docker 到暂存数据库的 SSH 隧道
问题描述
我可以创建一个包含我的项目代码的 docker。它的单元测试失败,因为没有数据库连接。我可以使用 SSH 密钥和凭据登录到具有包含我们测试数据的中央数据库的服务器。我无法让 docker 和 DB 进行通信。
在过去的两天里,我尝试了几种不同的建议,刮擦并重新启动了 Dockerfile 的这一部分。我在 Youtube 上搜索教程,在 Stackexchange 上搜索答案,在 docker 论坛上搜索以供参考。
如果有一步一步的教程,那就藏起来了,我也很想看到!
docker-compose 有以下内容:
services:
app:
build:
context: .
dockerfile: .docker/Dockerfile
args:
APP_PATH: ${APP_PATH}
image: laravel-docker
env_file: .env
ports:
- 8080:80
# We need to expose 443 port for SSL certification.
- "443:443"
volumes:
- .:/var/www/jumbledown
在容器内,我可以通过以下方式联系远程数据库的主机:
ssh -4 -R 8888:localhost:8888 [devname]@NN.NN.NN.NN -i ~/ident -p [portnumber]
其中: - devname 是我的登录名。 - NN.NN.NN.NN 是数据库主机的 IP 地址。- ident 是一个包含 SSH 密钥的文件,该文件由 Dockerfile 中包含的复制命令复制。
Docker 文件是构建出来FROM php:7.1.8-apache
的,现在安装了很多额外的东西,包括 Xdebug。只是复制和粘贴太长了,我不确定哪些部分是相关的;我可以根据要求公开。
理想情况下,我希望能够使用 Dockerfile 设置一个 SSH 隧道,将数据库服务到 docker 容器。现在,我愿意在容器内手动设置连接。
更新根据答案中的问题,我需要创建的最终结果是让几个开发人员拥有本地 docker,并且每个开发人员都有一条通往包含测试数据的中央数据库的隧道,供我们在全天编码时使用。
解决方案
如果您希望 PHP 容器拥有到远程数据库的永久 SSH 隧道,您可以更改 Dockerfile 的COMMAND
语句(假设ENTRYPOINT
是 shell)以使用在后台创建 SSH 隧道的脚本,类似于您手动创建的,等待对于 SSH 隧道,然后继续运行您想要运行的任何内容。
您的问题缺少您要实现的目标的详细信息(永久隧道?仅在测试时?等)
此类脚本的示例:
# run ssh in background (notice the "&" at the end)
ssh -4 -R 8888:localhost:8888 $DB_USERNAME@$DB_HOST -i ~/ident -p $DB_PORT &
# wait for the ssh tunnel if needed
# ...
# run the main command here
# ...
我建议考虑不同的路径 -
在 docker-compose 文件中创建一个专用于打开隧道的新服务,然后从您的 PHP 服务连接到该服务。
推荐阅读
- c# - 在 c# 中运行时使用 selenium 更改代理端口
- javascript - 将来自两个不同输入的值相乘并显示在第三个输入中
- python-3.x - 仅当标记列为 1 时,如何计算滚动平均值
- python - 如何将列内部提取到几列
- hibernate - Session.get() 和 EntityManager.find() Hibernate 有什么区别
- javascript - 迭代嵌套对象
- r - 将分类变量转换为 R 中的因子时出错
- javascript - 使用 js react native 获取 Android 的触摸压力
- pixi.js - Pixi:SVG 没有按预期缩放
- gnuplot - 如何从 .csv 文件镜像和重复周期函数