链接容器与docker组成

我尝试运行一个实例与2个容器,1个容器与MySQL和其他与节点。

docker-compose.yml文件中:

api: build: ./server ports: - 8001:8001 links: - mysql:mysql mysql: image: mysql environment: MYSQL_DATABASE: ghostDB MYSQL_ROOT_PASSWORD: root volumes: - /data/mysql:/var/lib/mysql 

服务器的 Dockerfile /

 FROM node:0.12 ENV PORT 8001 ENV MYSQL_DATABASE ghostDB ENV MYSQL_USER root ENV MYSQL_PASSWORD root ENV MYSQL_HOST mysql ENV MYSQL_PORT 3306 ENV API_DIR /usr/src/server-celerative COPY . \${API_DIR} WORKDIR \${API_DIR} RUN npm install RUN node index.js 

index.js

 var db = mysql.createConnection({ host: 'mysql', port: '3306', user: 'root', password: 'root', database: 'ghostDB' }); 

但是我有输出:

 Error: getaddrinfo ENOTFOUND mysql at errnoException (dns.js:44:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26) -------------------- 

我不明白为什么不工作。

有人帮忙?

注:我使用boot2docker。

docker-compose v1无法确保在启动节点容器之前,mysql进程已完全启动并初始化。 因此,您的节点容器负责testingmysql是否可用,以及等待/重试,直到可用。

您可以在应用程序中使用节点来执行此操作( 池连接可能就是这种方式); 或提供一个testingmysql连接的boostrap shell脚本,一旦可用,将启动节点。

image: mysql后面的mysql部分添加一行container_name: mysql image: mysql

可以添加以下Bash代码以确保3306端口已打开:

while ! ( exec 2>/dev/null ; echo > /dev/tcp/mysql/3306 ) ; do sleep 1 ; done