2017-04-06 37 views
0

我試圖用作爲基礎鏡像使用mysql5.6建立鏡像。我需要在數據庫啓動之前做一些初始化,所以我需要重寫的入口點:Dockerfile:是否可以引用重寫的入口點和cmd?

# Stuff in my Dockerfile 
... 
COPY my-entrypoint.sh /usr/local/bin/ 
ENTRYPOINT ["my-entrypoint.sh"] 

我的入口點是相當簡單,太:

#!/bin/bash 
echo "Running my-entrypoint.sh" 
# My initialization stuff here 
... 
# Call mysql entrypoint 
/usr/local/bin/docker-entrypoint.sh mysqld 

這似乎是工作,但我d而不必在我的腳本(或我的Dockerfile)中硬編碼mysql入口點。有沒有辦法在我的Dockerfile中引用重寫的入口點,以便它可用於我的入口點腳本?也許這樣的事情?

COPY my-entrypoint.sh /usr/local/bin/ 
ENTRYPOINT ["my-entrypoint.sh", BASE_ENTRYPOINT, BASE_CMD] 

回答

0

它必須在某處出現,否則你不能得到這樣的信息。

  • 選項1:使用ENV對於以前的入口點在Dockerfile,然後參考它在自己的entrypoint.sh:

    Dockerfile:

    FROM alpine:3.3 
    
    ENV MYSQL_ENTRYPOINT "/usr/bin/mysql mysqld" 
    ADD entrypoint.sh/
    ENTRYPOINT ["/entrypoint.sh"] 
    

    Entrypoint.sh:

    #!/bin/sh 
    
    echo $MYSQL_ENTRYPOINT 
    
  • 選項2:剛剛通過以前的入門指示T指令作爲參數傳遞給您的入口點:

    Dockerfile:

    FROM alpine:3.3 
    
    ADD entrypoint.sh/
    ENTRYPOINT ["/entrypoint.sh"] 
    CMD ["/usr/bin/mysql mysqld"] 
    

    Entrypoint.sh:

    #!/bin/sh 
    
    echo $1 
    

我個人更喜歡選擇#1。

+0

這兩個選項似乎仍要求它是硬編碼的,只是在Dockerfile現在。 –

+0

在運行時將它傳入'docker run ... -e MYSQL_ENTRYPOINT = ...' – johnharris85

+1

感謝您的信息傢伙,我相信它必須以某種方式出現在某個地方,我不認爲在運行時傳遞它是個好主意,這個env變量對於每個運行時或者不同的平臺都沒有不同你將運行這個容器,在構建階段它一定是確定的,在運行時傳遞它只會增加額外的工作。 – shizhz

0

2種方式:

只是通過它在您指定的圖像後,在這之後一切都變得CMD和附加到ENTRYPOINT。所以......

# Stuff in my Dockerfile 
... 
COPY my-entrypoint.sh /usr/local/bin/ 
ENTRYPOINT ["my-entrypoint.sh"] 

然後docker run ... image <your-entrypoint-etc>那麼就已經自定義的入口點拿起一號ARG它並使用它,但是你所需要的。

第二種方法,只是在運行時將它作爲環境變量傳遞。

docker run ... -e MYSQL_ENTRYPOINT=<something> ...

而在你的入口點腳本指的是環境變量... $MYSQL_ENTRYPOINT ...