38810


`depends_on`を使ってアプリケーションコンテナからDBコンテナに接続したいのですが、以下のようにdocker-
compose.ymlを定義しましたが、接続できません。アプリケーションコンテナに入り、`/etc/hosts`を確認しましたが、dbコンテナのアドレスがありませんでした。`depends_on`にコンテナを登録すると自動的にそのコンテナのリンクが`/etc/hosts`に追記されるのではないのでしょうか。  
参照: <https://qiita.com/sivertigo/items/9baa73d922a68788402b>

**docker-compose.yml**

[code]

    version: '3'
    services:
      app:
        build: ./../../
        working_dir: /go/src/github.com/username/appname
        #restart: always
        env_file:
          - env
        depends_on: 
          - db
        command: sh /go/src/github.com/username/appname/wait.sh db /go/bin/appname
        logging:
          driver: syslog
    
      db:
        image: mysql:5.7
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_RANDOM_ROOT_PASSWORD: 1
          #MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: dbname
          MYSQL_USER: username
          MYSQL_PASSWORD: password
        logging:
          driver: syslog
    
    volumes:
      db_data:
    
[/code]

**Dockerfile**

[code]

    FROM golang:alpine
    
    ADD . /go/src/github.com/username/appname
    WORKDIR /go/src/github.com/username/appname
    RUN apk add --update git
    RUN apk add --update mysql-client
    
    RUN go get -u github.com/Masterminds/glide
    RUN glide install
    RUN go install
    
    EXPOSE 80
    
[/code]

**wait.sh**

[code]

    #!/bin/sh
    
    set -e
    
    host="$1"
    shift
    cmd="$@"
    
    until mysqladmin ping -h host --silent; do
      echo 'waiting for mysql'
      sleep 1
    done
    
    echo "MySQL is up - executing command"
    exec $cmd
    
[/code]

**/etc/hosts**

[code]

    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2  fadc826189c0
    
[/code]


CC BY-SA 3.0
2017-10-17T05:09:22.137
38779
2017-10-17T22:23:07.917
7232
question
docker docker-compose
docker-compose, depends_onで/etc/hostsにホスト名が追記されない。


# dockerについて

`depends_on`は起動順序を制御するためのオプションであり  
`depends_on`を指定したから名前解決できるようになる，というものではありません．

また，docker-composeを利用する場合，コンテナ間の名前解決には組込みDNSが利用されます．  
同一のネットワークに配置されたコンテナは組込みDNSを用いて名前解決されるため  
`/etc/hosts`にアドレスが記載されることはありません．  
組込みDNSについては`/etc/resolv.conf`に`127.0.0.11`が指定されています．

<https://docs.docker.com/engine/userguide/networking/configure-dns/>

# appからdbへの接続について

スクリプトを見るとタイポのようです．  
`wait.sh`において

> until mysqladmin ping -h host --silent; do

これは以下の間違いではないでしょうか．

> until mysqladmin ping -h $host --silent; do

おそらく名前解決自体はdockerではできているので  
appコンテナ上から`ping db`など実行すれば  
到達確認はできると思います．


CC BY-SA 3.0
2017-10-17T22:23:07.917
38810
2017-10-17T22:23:07.917
7770
38779
answer