Docker撰写无效的卷目标路径:“。” 安装路径必须是绝对的

Sha*_*han 4 h2 docker dockerfile docker-compose

以下是我的可运行H2数据库的dockerfile:我想为此创建一个docker compose文件。

FROM klousiaj/oracle-java:7.79
MAINTAINER J.P. Klousia <klousiaj>

ENV DOWNLOAD http://www.h2database.com/h2-2016-10-31.zip
ENV DATA_DIR /opt/h2-data

RUN curl ${DOWNLOAD} -o h2.zip \
    && unzip h2.zip -d /opt/ \
    && rm h2.zip \
    && mkdir -p ${DATA_DIR}

EXPOSE 8082 9092

CMD java -cp /opt/h2/bin/h2*.jar org.h2.tools.Server \
    -web -webAllowOthers -webPort 8082 \
    -tcp -tcpAllowOthers -tcpPort 9092 \
    -baseDir ${DATA_DIR}

VOLUME ${DATA_DIR}
Run Code Online (Sandbox Code Playgroud)

以下是我正在尝试执行的docker compose:

version: '2'


services:
    db:
        image: klousiaj/oracle-java:7.79
        environment: 
            DOWNLOAD: http://www.h2database.com/h2-2016-10-31.zip
            DATA_DIR: /opt/h2-data
        command: curl ${DOWNLOAD} -o h2.zip \ && unzip h2.zip -d /opt/ \ && rm h2.zip \ && mkdir -p ${DATA_DIR}
        expose: 
            - "8082-9092"
        command: java -cp /opt/h2/bin/h2*.jar org.h2.tools.Server \ -web -webAllowOthers -webPort 8082 \ -tcp -tcpAllowOthers -tcpPort 9092 \ -baseDir ${DATA_DIR}
        volumes: 
            - ${DATA_DIR}
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

错误:对于db无法为服务db创建容器:无效的卷规范“。”:无效的卷目标路径:'。' 安装路径必须是绝对的。

nil*_*loc 12

我有同样的错误消息,这是一个愚蠢的错误。我忘记在容器目录 /app 上放置前导斜杠

volumes:
      - ./api/app:app
Run Code Online (Sandbox Code Playgroud)

volumes:
      - ./api/app:/app
Run Code Online (Sandbox Code Playgroud)


Eug*_*yer 6

只是在Compose文件中是不允许的,因为那里没有模板引擎。

您将不需要定义

volumes: 
        - /opt/h2-data
Run Code Online (Sandbox Code Playgroud)

因为这将自动完成(匿名卷)。如果要命名卷使用

volumes: 
        - myname:/opt/h2-data
Run Code Online (Sandbox Code Playgroud)

或主机挂载

volumes: 
        - /path/on/the/host:/opt/h2-data
Run Code Online (Sandbox Code Playgroud)

因此,$ {DATA_DIR}不会在组合文件的卷中(从ENV扩展)。有一些像rancher-compose这样的方言提供了这一点,但总的来说这是不可能的

更新:更新了我的答案,因为我以某种方式混合了Dockerfile / docker-compose.yml文件。这在Dockerfile中是有意义的,因为它只是用作变量。谢谢您对我的@Bmitch提示(再次)

  • Dockerfile VOLUME 命令应该允许变量扩展。但是对于撰写文件,您是正确的。参考:https://docs.docker.com/engine/reference/builder/#environment-replacement (2认同)

syl*_*asa 6

去掉.之前的app 更改这个

volumes:
      - ./api:/app
      - ./app/node_modules
Run Code Online (Sandbox Code Playgroud)

volumes:
      - ./api:/app
      - /app/node_modules
Run Code Online (Sandbox Code Playgroud)

因为/app或任何您命名的工作目录在 中创建/