代码之家  ›  专栏  ›  技术社区  ›  Escher

无法让dep和dockerize在docker compose中一起工作(但它们单独工作)。为什么?

  •  1
  • Escher  · 技术社区  · 7 年前

    我有一个奇怪的情况,我的docker compose build在我使用 dockerize 等待数据库等准备就绪,并使用 dep 加载我的go依赖项。

    下面是docker-compose.yml的摘录(除了下面显示的golang容器外,还有mosquito、postgres和python容器)

    version '3.3'
    services:
    
       foobar_container:
         image: foobar_image
         container_name: foobar
         build:
          context: ./build_foobar
          dockerfile: Dockerfile.foobar
         #command: dockerize -wait tcp://mosquitto:1883 -wait tcp://postgres:5432 -timeout 200s /go/src/foobar/main
         volumes:
           - ./foobar:/go
         stdin_open: true
         tty: true
         external_links:
           - mosquitto
           - postgres
         ports:
           - 1833
           - 8001
         depends_on:
           - mosquitto
           - postgres
    

    这是我的dockerfile.foobar

    FROM golang:latest
     WORKDIR /go
     RUN apt-get update && apt-get install -y wget mosquitto-clients net-tools
     ENV DOCKERIZE_VERSION v0.6.0
     RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
       && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
       && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
     ADD foobar.sh /foobar.sh
     #RUN go build main.go
     RUN chmod +x /foobar.sh
    

    这是我的构建脚本foobar.sh:

    #!/bin/bash
    
    mkdir -p /go/bin # required directory that may have been overwriten by docker-compose `volumes` param
    echo "++++++++ Downloading Golang dependencies ... ++++++++"
    cd /go/src/foobar
    curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
    echo "++++++++ Installing Golang dependencies ... ++++++++"
    dep ensure
    echo "++++++++ Testing MQTT message broker ... ++++++++"
    until [[ $(mosquitto_sub -h "mosquitto" -t '$SYS/#' -C 1 | cut -c 1-9) = "mosquitto" ]]; do
        echo "++++++++ Message broker is not ready. Waiting one second... ++++++++"
        sleep 1
    done
    echo "++++++++ Building application... ++++++++" 
    go build main.go
    

    如果我取消注释 command 线 docker-compose.yml 我的 foobar.sh 不会跑过去的 curl 线。没有输出错误,只是停止执行。 如果我的评论来自 卷曲 继续,取消注释 命令 行,我可以设置为完成(但是 foobar 容器需要手动启动)。我的python容器(取决于所有postgres、go和mosquitto容器)设置得很好。

    怎么了?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Carlos Frias    7 年前

    我发现了两件事,首先是执行命令,你必须确保 foobar.sh 先执行。作为另一个建议,我不会忽略整个 /go 容器中的文件夹使用卷,而不是使用另一个子文件夹,例如 /go/github.com/my-project . 我使用此配置运行了一个应用程序,基于您的:

    build_foobar/Dockerfile.foobar :

    FROM golang:latest
    WORKDIR /go
    RUN apt-get update && apt-get install -y wget mosquitto-clients net-tools
    ENV DOCKERIZE_VERSION v0.6.0
    RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
            && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
            && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
    ADD foobar.sh /foobar.sh
    # RUN go build main.go
    RUN chmod +x /foobar.sh
    

    build_foobar/foobar.sh :

    #!/bin/bash
    
    # mkdir -p /go/bin # required directory that may have been overwriten by docker-compose `volumes` param
    echo "++++++++ Downloading Golang dependencies ... ++++++++"
    cd /go/src/foobar
    curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
    echo "++++++++ Installing Golang dependencies ... ++++++++"
    dep ensure
    echo "++++++++ Testing MQTT message broker ... ++++++++"
    until [[ $(mosquitto_sub -h "mosquitto" -t '$SYS/#' -C 1 | cut -c 1-9) = "mosquitto" ]]; do
        echo "++++++++ Message broker is not ready. Waiting one second... ++++++++"
        sleep 1
    done
    echo "++++++++ Building application... ++++++++" 
    go build main.go
    
    dockerize -wait tcp://mosquitto:1883 -wait tcp://postgres:5432 -timeout 200s /go/src/foobar/main
    

    foobar/main.go :放置应用程序主文件

    docker-compose.yml :

    version: '3.3'
    services:
      foobar_container:
        image: foobar_image
        container_name: foobar
        build:
          context: ./build_foobar
          dockerfile: Dockerfile.foobar
        # command: dockerize -wait tcp://mosquitto:1883 -wait tcp://postgres:5432 -timeout 200s /go/src/foobar/main
        # command: /bin/bash
        command: /foobar.sh
        volumes:
          - ./foobar:/go/src/foobar
        stdin_open: true
        tty: true
        external_links:
          - mosquitto
          - postgres
        depends_on:
          - mosquitto
          - postgres
        ports:
          - 1833
          - 8001
      mosquitto:
        image: eclipse-mosquitto
      postgres:
        image: postgres