使用 docker-compose 链接容器

Linking container with docker-compose

我尝试 运行 一个带有 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进程在启动节点容器前完全启动并初始化。因此,您的节点容器负责测试 mysql 是否可用,并负责测试 waiting/retrying 直到它可用。

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

image: mysql 之后的 mysql 部分添加行 container_name: mysql

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

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