2017-05-10 73 views
1

我有興趣使用wait-for-it在Docker-Compose中使用基於Alpine Linux發行版的圖像來等待另一個服務。如何在Alpine Linux中使用bash腳本?

但是,如果我克隆wait-for-it庫,並添加到它下面Dockerfile

FROM alpine 
RUN apk --update add bash 
COPY wait-for-it.sh wait-for-it.sh 
CMD ["./wait-for-it.sh", "www.google.com:80"] 

然後我建立它使用docker build --tag waitforit .其次docker run waitforit,但我收到此錯誤信息:

timeout: can't execute '15': No such file or directory 
wait-for-it.sh: timeout occurred after waiting 15 seconds for www.google.com:80 

相比之下,這是我在我的(Ubuntu 16.04 LTS)計算機上運行此命令時看到的:

wait-for-it.sh: waiting 15 seconds for www.google.com:80 
wait-for-it.sh: www.google.com:80 is available after 0 seconds 

好像bash腳本不能在我的Ubuntu本地機器上的Alpine容器中工作。我怎樣才能解決這個問題?

+2

wait-for-it.sh的可執行文件是什麼?看到它的第一行。 #!/ bin/bash或sh? – Robert

+0

看起來像你的shell腳本包含錯誤。請粘貼腳本 – n2o

回答

2

wait-for-it腳本不兼容,所以你需要安裝bash到你的高山形象。

但是,我可以建議避免這樣的「黑客」,並利用HEALTHCHECK而不是?

例如,有一個服務等待另一個是健康的應該是這樣的:

services: 
    my_service: 
    image: something 
    healthcheck: 
     test: nc -z 3306 

    other_service 
    depends_on: 
    my_service: 
     condition: service_healthy 

請注意,這隻會與v2撰寫文件時,不v3

+1

事實上,我後來發現[wait-for](https://github.com/Eficode/wait-for),它基於「等待它」,但是符合「阿爾派」。至於[HEALTHCHECK](https://docs.docker.com/engine/reference/builder/#healthcheck),從文檔中我可以看出它在容器啓動後運行__interval__秒,然後在每次運行後再次運行__interval__秒先前的檢查完成。但是,在我的情況下,我想在運行實際應用程序之前運行檢查一次,並阻止它通過。 –

1

如果你來到這裏因爲我曾經在Alpine上尋找運行腳本的「沒有這樣的文件或目錄」錯誤的解決方案,所以要檢查的另一件事是您的腳本具有unix行結尾。

在我的情況下,我在窗口中保存腳本並將其添加到泊塢窗圖像中,並且它給出了同樣無用的錯誤消息。