[英]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.