Docker-Compose 仅​​在存在时绑定卷

Fre*_*ers 11 docker docker-compose

bind我有一个用于共享本地目录的卷。有时该目录不存在并且 docker 退出并出现错误

Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /srv/share.
Run Code Online (Sandbox Code Playgroud)

如何告诉 docker-compose 查找源目录并在存在时使用它,或者如果源目录不存在则继续而不安装卷?

体积示例:

  - type: bind
    read_only: true
    source: /srv/share/
    target: /srv/share/
Run Code Online (Sandbox Code Playgroud)

Exa*_*a37 9

我如何告诉 docker-compose 查找该目录并使用它(如果存在)或如果出现错误则在没有所述卷的情况下继续?

据我所知,您无法执行条件逻辑来安装卷,但我在我的一个项目中绕过了它,如下所示:

version: "2.1"

services:

  elixir:
    image: elixir:alpine
    volumes:
      - ${VOLUME_SOURCE:-/dev/null}:${VOLUME_TARGET:-/.devnull}:ro

Run Code Online (Sandbox Code Playgroud)

在这里我使用/dev/null作为后备,但在我的实际项目中我只是使用一个空文件来进行映射。

${VOLUME_SOURCE:-/dev/null}就是 bash 使用未设置的变量的默认值的方式,并且 docker compose 支持它们。

在不设置环境变量的情况下进行测试

$ sudo docker-compose run --rm elixir sh 

/ # ls -al /.devnull 
crw-rw-rw-    1 root     root        1,   3 May 21 12:27 /.devnull
Run Code Online (Sandbox Code Playgroud)

使用环境变量集进行测试

创建.env文件:

$ printf "VOLUME_SOURCE=./testing \nVOLUME_TARGET=/testing\n" > .env && cat .env
VOLUME_SOURCE=./testing 
VOLUME_TARGET=/testing
Run Code Online (Sandbox Code Playgroud)

创建用于测试目的的卷:

$ mkdir testing && touch testing/test.txt && ls -al testing
total 8
drwxr-xr-x 2 exadra37 exadra37 4096 May 22 13:12 .
drwxr-xr-x 3 exadra37 exadra37 4096 May 22 13:12 ..
-rw-r--r-- 1 exadra37 exadra37    0 May 22 13:12 test.txt
Run Code Online (Sandbox Code Playgroud)

运行容器:

$ sudo docker-compose run --rm elixir sh
/ # ls -al /testing/
total 8
drwxr-xr-x    2 1000     1000          4096 May 22 12:01 .
drwxr-xr-x    1 root     root          4096 May 22 12:07 ..
-rw-r--r--    1 1000     1000             0 May 22 12:01 test.txt
/ # 
Run Code Online (Sandbox Code Playgroud)