摘錄至:場景二應用執行前的準備工作
之前在做mysql的docker swarm編排工具時,遇到需要安裝mysql業務資料庫。用了一種很土的方法。
這裡看到,dockerfile的entrypoint、cmd提供了優雅點的做法:
場景二:應用執行前的準備工作
啟動容器就是啟動主程序,但有些時候,啟動主程序前,需要一些準備工作。
比如mysql
類的資料庫,可能需要一些資料庫配置、初始化的工作,這些工作要在最終的 mysql 伺服器執行之前解決。
此外,可能希望避免使用root
使用者去啟動服務,從而提高安全性,而在啟動服務前還需要以root
身份執行一些必要的準備工作,最後切換到服務使用者身份啟動服務。或者除了服務外,其它命令依舊可以使用root
身份執行,方便除錯等。
這些準備工作是和容器cmd
無關的,無論cmd
為什麼,都需要事先進行乙個預處理的工作。這種情況下,可以寫乙個指令碼,然後放入entrypoint
中去執行,而這個指令碼會將接到的引數(也就是)作為命令,在指令碼最後執行。比如官方映象
redis
中就是這麼做的:
from alpine:3.4
...run addgroup -s redis && adduser -s -g redis redis
...entrypoint ["docker-entrypoint.sh"]
expose 6379
cmd [ "redis-server" ]
可以看到其中為了 redis 服務建立了 redis 使用者,並在最後指定了entrypoint
為docker-entrypoint.sh
指令碼。
#!/bin/sh
...# allow the container to be started with `--user`
if [ "$1" = 'redis-server'
-a"$(id -u)" = '0' ]; then
chown -r redis .
exec su-exec redis "$0"
"$@"
fiexec
"$@"
該指令碼的內容就是根據cmd
的內容來判斷,如果是redis-server
的話,則切換到redis
使用者身份啟動伺服器,否則依舊使用root
身份執行。比如:
$ docker run -it redis id
uid=0(root) gid=0(root) groups=0(root)
Spring容器啟動 Bean的3種初始化方式
通常我們建立乙個bean的時候,可能有這樣的需求,比如我建立了乙個連線資料庫的bean類,我希望在spring容器建立的時候,就檢查下是否能正常訪問資料庫。這時候我們可以借助於以下方式進行實現。1 如果是通過xml配置檔案進行bean的生成,我們可以在配置bean的時候,加下init method ...
docker中mysql初始化及啟動失敗解決辦法
在docker中有乙個mysql服務,其資料檔案是掛在在主機外面的檔案,在docker中的root有訪問該資料檔案的許可權,但是docker中mysql訪問資料檔案的時候提示許可權不足,於是只有以root使用者來啟動mysql了。資料初始化 mysql install db user root ex...
IOC 容器初始化小結
總結一下ioc 容器初始化的基本步驟 1 初始化的入口在容器實現中的refresh 呼叫來完成。2 對bean 定義載入ioc 容器使用的方法是loadbeandefinition 其中的大致過程如下 通過resourceloader 來完成資源檔案位置的定位,defaultresourceload...