以下是我的dockerfile,用于运行H2数据库: 我想为此创建一个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}
以下是我试图执行的码头工作:
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}
我得到错误:
错误:for db无法为服务db创建容器:无效的卷规范&#34;。&#34;:无效的卷目标路径:&#39;。&#39;装载路径必须是绝对的。
答案 0 :(得分:5)
这在Compose文件中是不允许的,因为那里没有模板引擎。
您无需定义
volumes:
- /opt/h2-data
因为那将自动完成(匿名卷)。如果要使用命名卷
volumes:
- myname:/opt/h2-data
或主机挂载
volumes:
- /path/on/the/host:/opt/h2-data
因此$ {DATA_DIR}未在合成文件中的卷(来自ENV)中展开。像rancher-compose这样的方言提供了这个,但一般来说这是不可能的
更新:更新了我的答案,因为我以某种方式混合了Dockerfile / docker-compose.yml文件。它在Dockerfile中很有意义,因为它只是用作变量。谢谢你在@Bmitch上再次暗示我(再次)
答案 1 :(得分:0)
我有同样的错误信息,这是一个愚蠢的错误。我忘了在容器目录/ app
上加上前导斜线之前
yaml
之后
volumes:
- ./api/app:app