2016-08-01 43 views
3

我現在在學習docker,並開始自己構建mysql映像。如何在docker運行之後但在入口點之前執行初始化腳本一次?

Dockerfile:

FROM centos 
MAINTAINER Michael 
ENV REFRESHED_AT 2016-07-29 
RUN yum install -y mysql mariadb-server 
VOLUME /var/lib/mysql 
ENTRYPOINT ["/usr/libexec/mysqld", "--user=root"] 
EXPOSE 3306 

泊塢窗運行命令

docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql 

這給了一個錯誤,因爲我必須給exec mysql_install_db先初始化數據庫。但是我無法在Dockerfile中添加RUN mysql_install_db,因爲我想使用Volume作爲外部數據存儲。

那麼我應該怎麼做?

我知道有一個名爲mysql的官方圖片。我只是想做這個練習。


更新: 感謝@Pieter。我終於用他的解決辦法是提供另一種entrypoint.sh結合的init &在Dockerfile啓動腳本,然後使它作爲入口點這樣做:

FROM centos 
MAINTAINER Michael 
ENV REFRESHED_AT 2016-07-29 
RUN yum install -y mysql mariadb-server 
VOLUME /var/lib/mysql 
COPY entrypoint.sh /usr/local/bin/ 
ENTRYPOINT ["entrypoint.sh"] 
EXPOSE 3306 

entrypoint.sh

#!/bin/bash 

if [ ! -d "/var/lib/mysql/mysql" ]; then #check whether the DB is initialized. 
    echo 'Initializing database' 
    mysql_install_db 
    echo 'Database initialized' 
fi 

/usr/libexec/mysqld --user=root 

搬運工運行

docker run -d --name mysql -v /root/docker/mysql/data:/var/lib/mysql -p 3306:3306 michael/mysql 

這爲這種情況提供了一個通用的解決方案。

回答

3

我不是專家,但我知道在入口點之前沒有辦法運行一些腳本,因爲ENTRYPOINT實際上是您的容器運行的第一個東西。

您可以做的是將自定義腳本添加到您的docker容器,該容器包含mysql_install_db和mysqld指令並將其用作入口點。

所以你的dockerfile可能看起來像這樣。

FROM centos 
MAINTAINER Michael 
ENV REFRESHED_AT 2016-07-29 
RUN yum install -y mysql mariadb-server 
VOLUME /var/lib/mysql 
COPY start.sh/
ENTRYPOINT ["/entrypoint.sh"] 
EXPOSE 3306 

entrypoint.sh只是看起來像這樣。

/usr/libexec/mysql_install_db --user=root 
/usr/libexec/mysqld --user=root 

請注意,官方mariadb泊塢窗圖像中也使用了相同的技術。請參閱https://github.com/docker-library/mariadb/tree/d969a465ee48fe10f4b532276f7337ddaaf3fc36/10.1

請注意,官方圖像結合了入口點和CMD。在學習Docker時,您可能想看看https://www.ctl.io/developers/blog/post/dockerfile-entrypoint-vs-cmd/以獲取更多關於入口點和CMD如何一起使用的信息。

UPDATE 假設mysql_install_db的僅僅是建立在一些文件在/ var/lib中/ MySQL的,你應該能夠爲您泊塢窗構建的一部分運行mysql_install_db。 (這並不意味着你應該 - >看官方mariadb圖像)。

docker run命令使用基礎映像中指定位置存在的任何數據初始化新創建的卷。見https://docs.docker.com/engine/reference/builder/#/volume

+0

謝謝!你讓我今天一整天都感覺很好。 – Michael

相關問題