Docker Symbolic Linked Volumes

在 docker 裡出現 symbolic links 要注意喔!

Introduction

最近工作上用 Docker 來建立自己的 TensorFlow 開發環境, 因為 TensorFlow 的 Docker Images 其實是使用 root , 而且想要再上面再裝一些自己的 Packages ,所以會寫一個 Dockerfile , 基於 **TensorFlow 的 Docker Images ** 。

其實這邊會先有一個問題,因為不想用 root ,所以在 Dockerfile 裡面會 新增一個一般 user ,但是這個 useruid 預設會是 1000 , 可能跟外面的 uid 不同,怎麼解決這個另外再說。

這篇要講的是 Docker Volumes 的部份,首先就是想要把外面的 Source code 或是其他的目錄,放進 Docker Container 裡面,為了不要一直 docker cp , 其實是可以善加利用 Docker Volumes ,像是如下的設定,

1
2
3
4
5
6
7
8
9
10
$DOCKER start $CONTAINER_NAME > /dev/null 2> /dev/null || {
echo "Creating new container..."
$DOCKER run \
--detach \
--net=host \
--name $CONTAINER_NAME \
--tty \
--volume $PWD/volumes:/home/user/volumes \
$IMAGE_NAME:$TAG_NAME
}

通常這樣是很 OK 的,在這層目錄的 volumes 就會對應到 Docker Container 裡面的 /home/user/volumes ,外面改裡面也看得到,反之亦然。

不過要是 volumes 裡面包含有 symbolic link 的目錄,就會出錯了, 因為 Docker Container 裡面通常不會有一樣指過去的路徑。

所以就寫了一個,可以自己尋找 volumes 底下 symbolic link 的目錄, 再用多個 –volume 串起來的功能。

1
2
3
4
5
6
7
8
function get_volumes_opt() {
VOLUMES_OPT="--volume $PWD/volumes:/home/tflite/volumes"
VOLUMES_OPT="$VOLUMES_OPT --volume $HOME/.Xauthority:/home/tflite/.Xauthority:rw"
for dir in $(find volumes -maxdepth 1 -type l); do
VOLUMES_OPT="$VOLUMES_OPT --volume $(realpath $dir):/home/tflite/$dir"
done
}
get_volumes_opt