如何在自动重新启动之后在自动扩展docker结构中保留唯一的容器标识符?

我的应用程序包含几个相同的微服务实例,并设置了自动重启。 当一个实例重新启动时,它必须在数据库中执行一些完整性检查和清理工作,但只有它自己。

我使用的解决scheme是在docker文件中声明一个环境variables来区分这些实例。 假设我有两个实例,docker-file-for-instance-1包含:

ENV INSTANCE=1 

docker-file-for-instance-2包含:

 ENV INSTANCE=2 

有了这个技巧,实例可以在重新启动之后检查自己工作的数据,这些数据是通过一个列实例的数据logging在数据库中的,该列实例取环境variablesINSTANCE的值。

但是这个规模很大。

  • 第一个想法是每个实例都有一个docker文件,所以没有INSTANCE环境variables。 但是,那么如何区分哪些实例在数据库中写入?
  • 第二个想法是使用pipe理器来pipe理docker文件中的实例值。 我还不知道这些技术。 可能吗 ?

编辑:添加Tarun Lalwani解决scheme以检查UUID行为与两个容器

test.sh

 #!/bin/bash echo "Building Image" docker build -t c1i . > /dev/null echo "Killing existing container if any" for c in c1 c2; do if [[ `docker ps --filter "name=$c" --format "{{.Names}}"` == $c ]]; then docker kill $c; docker rm $c; fi; echo "Starting container $c in background" docker run -d --name $c c1i > /dev/null docker ps -a echo "Restarting container $c" docker restart $c > /dev/null docker ps -a done; for c in c1 c2; do echo "Restarting container $c again" docker restart $c > /dev/null docker ps -a done; for c in c1 c2; do echo "Checking container $c logs" docker logs $c done; docker ps -a for c in c1 c2; do echo "Checking container $c UUID" docker exec $c cat /etc/environment.container done; echo "Killing containers" for c in c1 c2; do if [[ `docker ps --filter "name=$c" --format "{{.Names}}"` == $c ]]; then docker kill $c; docker rm $c; fi; done; 

init.sh

 #!/bin/sh ENV_FILE=/etc/environment.container #cat $ENV_FILE if [ -f $ENV_FILE ]; then . $ENV_FILE fi if [ -z "${CONTAINER_UUID}" ]; then echo "Starting container for the first time" CONTAINER_UUID=$(uuidgen -r) echo "CONTAINER_UUID=$CONTAINER_UUID" >> $ENV_FILE echo "UUID of new container is $CONTAINER_UUID" else CONTAINER_UUID=${CONTAINER_UUID} echo "Restarting container with $CONTAINER_UUID" fi echo "------------------ END OF CONTAINER INIT ----------------" exec tail -f /dev/null exit 0 

dockerfile是一样的。

这里是控制台输出:

 $ ./test.sh Building Image Killing existing container if any Starting container c1 in background CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cd1b7961f5a c1i "/bin/sh -c /init.sh" 2 seconds ago Up Less than a second c1 Restarting container c1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cd1b7961f5a c1i "/bin/sh -c /init.sh" 14 seconds ago Up Less than a second c1 Starting container c2 in background CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8654d93936e c1i "/bin/sh -c /init.sh" 2 seconds ago Up Less than a second c2 1cd1b7961f5a c1i "/bin/sh -c /init.sh" 16 seconds ago Up 2 seconds c1 Restarting container c2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8654d93936e c1i "/bin/sh -c /init.sh" 15 seconds ago Up Less than a second c2 1cd1b7961f5a c1i "/bin/sh -c /init.sh" 29 seconds ago Up 14 seconds c1 Restarting container c1 again CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8654d93936e c1i "/bin/sh -c /init.sh" 27 seconds ago Up 12 seconds c2 1cd1b7961f5a c1i "/bin/sh -c /init.sh" 41 seconds ago Up Less than a second c1 Restarting container c2 again CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8654d93936e c1i "/bin/sh -c /init.sh" 39 seconds ago Up Less than a second c2 1cd1b7961f5a c1i "/bin/sh -c /init.sh" 53 seconds ago Up 12 seconds c1 Checking container c1 logs Starting container for the first time UUID of new container is 432bfc77-e186-4ca2-bb9a-450b370d05a3 ------------------ END OF CONTAINER INIT ---------------- Restarting container with 432bfc77-e186-4ca2-bb9a-450b370d05a3 ------------------ END OF CONTAINER INIT ---------------- Restarting container with 432bfc77-e186-4ca2-bb9a-450b370d05a3 ------------------ END OF CONTAINER INIT ---------------- Checking container c2 logs Starting container for the first time UUID of new container is 9eae8f6c-c332-422a-a35a-6ec1d59b6e6c ------------------ END OF CONTAINER INIT ---------------- Restarting container with 9eae8f6c-c332-422a-a35a-6ec1d59b6e6c ------------------ END OF CONTAINER INIT ---------------- Restarting container with 9eae8f6c-c332-422a-a35a-6ec1d59b6e6c ------------------ END OF CONTAINER INIT ---------------- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8654d93936e c1i "/bin/sh -c /init.sh" 39 seconds ago Up Less than a second c2 1cd1b7961f5a c1i "/bin/sh -c /init.sh" 53 seconds ago Up 12 seconds c1 Checking container c1 UUID CONTAINER_UUID=432bfc77-e186-4ca2-bb9a-450b370d05a3 Checking container c2 UUID CONTAINER_UUID=9eae8f6c-c332-422a-a35a-6ec1d59b6e6c Killing containers 

我已经尝试了2个其他的解决scheme,但没有设法使他们的工作:

Dockerfile(替代1 – 不起作用)

 FROM ubuntu:16.04 RUN apt-get update -y && apt-get install uuid-runtime -y COPY ./init2.sh /etc/init.d/init.sh CMD chmod a+x /etc/init.d/init.sh 

Dockerfile(替代2 – 不起作用)

 FROM ubuntu:16.04 RUN apt-get update -y && apt-get install uuid-runtime -y COPY ./init.sh /etc/rc.local CMD chmod a+x /etc/rc.local 

init2.sh(可选 – 不起作用)

 #! /bin/sh PATH=/sbin:/bin do_start () { ENV_FILE=/etc/environment.container echo "exec init.sh on container :" cat $ENV_FILE if [ -f $ENV_FILE ]; then . $ENV_FILE fi if [ -z "${CONTAINER_UUID}" ]; then echo "Starting container for the first time" CONTAINER_UUID=$(uuidgen -r) echo "CONTAINER_UUID=$CONTAINER_UUID" >> $ENV_FILE echo "UUID of new container is $CONTAINER_UUID" else CONTAINER_UUID=${CONTAINER_UUID} echo "Restarting container with $CONTAINER_UUID" fi echo "------------------ END OF CONTAINER INIT ----------------" #exec tail -f /dev/null } do_status () { } case "$1" in start|"") do_start ;; restart|reload|force-reload|stop|status) # No-op ;; *) ;; esac exit 0 

我在这里做错了什么?

那么我不会在容器外面生成容器ID。 我只会从容器内部生成它。

我制定了一个很好的样本。

Dockerfile

 FROM ubuntu:16.04 RUN apt-get update -y && apt-get install uuid-runtime -y COPY ./init.sh /init.sh CMD /init.sh 

init.sh

 #!/bin/sh ENV_FILE=/etc/environment.container cat $ENV_FILE if [ -f $ENV_FILE ]; then . $ENV_FILE fi if [ -z "${CONTAINER_UUID}" ]; then echo "Starting container for the first time" CONTAINER_UUID=$(uuidgen -r) echo "CONTAINER_UUID=$CONTAINER_UUID" >> $ENV_FILE echo "UUID of new container is $CONTAINER_UUID" else CONTAINER_UUID=${CONTAINER_UUID} echo "Restarting container with $CONTAINER_UUID" fi echo "------------------ END OF CONTAINER INIT ----------------" exec tail -f /dev/null 

然后创build一个test.sh来查看function

test.sh

 #!/bin/bash echo "Building Image" docker build -t c1i . > /dev/null echo "Killing existing container if any" docker kill c1 > /dev/null docker rm c1 > /dev/null echo "Starting container in background" docker run -d --name c1 c1i > /dev/null echo "Restarting container" docker restart c1 > /dev/null echo "Restarting container again" docker restart c1 > /dev/null echo "Checking container logs" docker logs c1 

以上testing的输出如下

 Building Image Killing existing container if any Starting container in background Restarting container Restarting container again Checking container logs Starting container for the first time UUID of new container is 23615a43-3b59-4369-82c7-0202ad227403 ------------------ END OF CONTAINER INIT ---------------- cat: /etc/environment.container: No such file or directory CONTAINER_UUID=23615a43-3b59-4369-82c7-0202ad227403 Restarting container with 23615a43-3b59-4369-82c7-0202ad227403 ------------------ END OF CONTAINER INIT ---------------- CONTAINER_UUID=23615a43-3b59-4369-82c7-0202ad227403 Restarting container with 23615a43-3b59-4369-82c7-0202ad227403 ------------------ END OF CONTAINER INIT ---------------- 

正如你所看到的,环境variables总是唯一的,因为它是基于UUID的,并且在重新启动同一个容器后持久化