Docker容器啟動前的初始化(備忘)

2021-08-18 19:30:42 字數 1423 閱讀 4811

摘錄至:場景二應用執行前的準備工作

之前在做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 使用者,並在最後指定了entrypointdocker-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...