首页 > 解决方案 > 如何完成从本地开发 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,并且每个开发人员都有一条通往包含测试数据的中央数据库的隧道,供我们在全天编码时使用。

标签: mysqldockersshdockerfile

解决方案


如果您希望 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 服务连接到该服务。


推荐阅读