我一生都无法弄清楚这一点。我觉得我已经很接近了,但我只是还没有完全实现。这是我的 Dockerfile:
FROM ubuntu:14.04
MAINTAINER Oscar Godson
RUN apt-get update
RUN apt-get install -y nodejs-legacy
RUN apt-get install -y npm
RUN apt-get install -y mysql-server
RUN apt-get install -y mysql-client
COPY . /src
WORKDIR /src
RUN service mysql start;\
mysql -u root < /src/bin/demo-data.sql;\
npm install
EXPOSE 4000
CMD ["node", "index.js"]
如果我进入交互模式并进入 bash RUN service...
最后一行我可以看到 mysql 正在运行,演示数据已导入,一切正常,包括使用 node index.js
启动我的 Node 应用程序。如果我再尝试做另一个 RUN
或CMD
你在下面看到它不再可以访问MySQL。就像它停止运行一样。
我收到的错误Error: connect ECONNREFUSED
当它宕机或者数据不存在时就会发生这种情况。从我的角度来看,如果我尝试在RUN
之后访问它,MySQL似乎没有运行。我从哪里开始。
附注这里的MySQL DB纯粹用于开发。在生产中,我们使用 AWS RDS,这就是为什么它使用 root 而不使用任何密码并以这种方式导入数据。
最佳答案
问题是 RUN
不应该用于长时间运行的进程,但是,您只能使用一个 CMD
选项。由于某种原因,直到一位 friend 指出它才让我满意,但我可以制作一个“installer.sh”脚本并使用 CMD
调用它。现在它并没有丢失 MySQL 上下文。我的更新 Dockerfile 看起来像这样:
FROM ubuntu:14.04
MAINTAINER Oscar Godson
RUN apt-get update
RUN apt-get install -y nodejs-legacy
RUN apt-get install -y npm
RUN apt-get install -y mysql-server
RUN apt-get install -y mysql-client
COPY . /src
WORKDIR /src
RUN cd /src;npm install
EXPOSE 4000
CMD ./bin/installer.sh
安装程序比已
service mysql start
mysql -u root < ./bin/demo-data.sql
node index.js
关于mysql - Docker和MySQL无法连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28777946/