簡體   English   中英

當 docker 容器啟動時執行啟動腳本

[英]Executing a startup script when docker container is up

我用 Dockerfile 構建了一個 docker 圖像,如下所示。 一切正常,除了運行 php /var/www/api/startup.php這個 PHP 代碼很簡單,只是一個 API 請求從外部服務器獲取一些數據。

當我運行此圖像時,它運行良好,但我進入容器並看到創建的文件:ocr_url.json.. 說“錯誤.!!”。

當我親自運行 docker 容器中的 php 代碼時,它工作正常。 所以我檢查了 ENV 變量:$SERVER。 它返回我在 docker-compose.yml 中設置的“server-1”。

怎么了? 在我獲取 ENV 變量之前它是否執行 PHP 代碼? 請幫我解決這個問題。 謝謝

<?php

//echo $server = $_ENV['SERVER'];
$server = getenv('SERVER');

if($server) {
        $url = "https://{url}/?server=$server";

        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        //for debug only!
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        $resp = curl_exec($curl);

        curl_close($curl);

        //save to json file
        $file = fopen("ocr_url.json","w");
        fwrite($file, $resp);
        fclose($file);
}
else {
        $file = fopen("ocr_url.json","w");
        fwrite($file, 'error!!!');
        fclose($file);
}

Dockerfile

FROM server:v1.0

#startup program
CMD /root/startup.sh 
RUN php /var/www/api/startup.php

WORKDIR /var/www/api

docker-compose.yml

version: '3.8'

services:
  server1:
    image: '5318a9bfda5e'
    stdin_open: true
    tty: true
    ports:
      - '127.0.0.1:7771:80'
    environment:
      - 'SERVER=server-1'
  server2:
    image: '5318a9bfda5e'
    stdin_open: true
    tty: true
    ports:
      - '127.0.0.1:7772:80'
    environment:
      - 'SERVER=server-2'

盡管您在 Dockerfile 中擁有東西的順序,但RUN命令始終在映像構建序列期間運行,而不是在容器啟動時運行,並且它永遠無法調用其他服務。 它也看不到 Compose environment: settings 或build:塊之外的任何其他內容。 無論RUN命令的 output 是什么,都將被編譯到映像中,並且由於您為兩個容器運行相同的映像,因此它們將具有相同的下載文件。

入口點包裝器腳本可能很適合此設置。 當容器啟動時,使其主進程成為一個腳本,首先從另一個容器下載,然后運行標准容器CMD 該腳本可能如下所示:

#!/bin/sh

# Download the file from elsewhere
php /var/www/api/startup.php
# (or consider writing it as a half-dozen lines of shell code)

# Run the main container process (from the Dockerfile CMD for example)
exec "$@"

然后在您的 Dockerfile 中COPY此腳本並使其成為ENTRYPOINT

FROM server:v1.0

WORKDIR /var/www/api
# COPY entrypoint.sh .         # from the base image?
# RUN chmod +x entrypoint.sh   # Docker preserves permissions from the host

ENTRYPOINT ["./entrypoint.sh"] # must be JSON-array form
CMD /root/startup.sh           # unmodified from original Dockerfile

該文件不會在映像構建期間下載,但如果您啟動調試 shell

docker-compose run server1 sh

您將首先通過入口點腳本下載文件,然后再啟動sh命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM