我是docker中的新手,我试图让我的nodejs表达在其中运行。 我尝试使用shellscript及其工作来安装依赖项,但最终我无法连接到mysql。
我的docker文件安装mysql,创建用户和数据库,并安装nodejs。 然后它运行npm install并尝试启动我的应用程序,但knex说它无法通过消息连接到mysql:
Knex:Error Pool2 - Error: connect ECONNREFUSED /var/run/mysqld/mysqld.sock
以下是我使用的代码的要点。 (nodejs部分不完整,只有重要部分):
https://gist.github.com/jradesenv/527f6e59ab2e7985c38fbed3a2084c83
我希望任何人都会对如何解决这个问题有一个很好的想法。
答案 0 :(得分:4)
最佳做法是将微服务的组件分开放在自己的容器中。
例如,请参阅 Learn Docker by building a Microservice 中的“Dave Kerr”。
他确实宣布了两项服务:
CAT1 CAT2 CAT3 CAT4 CAT5
CASE 1 0.75 0.82 0.85 0.90 0.95
CASE 2 0.65 0.75 0.82 0.87 0.95
使用数据库的专用Dockerfile:
version: '2'
services:
users-service:
build: ./users-service
ports:
- "8123:8123"
depends_on:
- db
environment:
- DATABASE_HOST=db
db:
build: ./test-database
答案 1 :(得分:3)
Docker容器旨在运行单个命令。 mysql安装程序期望它注册的服务在操作系统启动时自动启动,但在容器内部并非如此。
正确的解决方案是将它们分成两个独立的容器,一个db容器和另一个nodejs / app容器。使用docker-compose配置链接并运行两者,自动设置主机名。
不太理想的选项是supervisord,您可以使用它来运行和管理容器内的多个进程。您可以像安装任何其他应用程序一样安装它,将您的数据库和节点应用程序配置为两个服务供管理员监督,然后启动supervisord作为容器的运行命令。
答案 2 :(得分:1)
使用docker-compose并为您的nodejs创建一个dockerfile,为mysql创建一个dockerfile。每个容器都负责做他们的事情。在你的作品中,链接它们。然后将nodejs db连接指向mysql容器。