使用 Docker Compose 未定义卷

问题描述 投票:0回答:3

我想将此 docker CLI 命令(来自 smallstep/step-ca)转换为 docker-compose.yml 文件以与

docker compose
(版本 2)一起运行:

docker run -d -v step:/home/step \
    -p 9000:9000 \
    -e "DOCKER_STEPCA_INIT_NAME=Smallstep" \
    -e "DOCKER_STEPCA_INIT_DNS_NAMES=localhost,$(hostname -f)" \
    smallstep/step-ca

此命令成功启动容器。

这是我“撰写”的撰写文件:

version: "3.9"
services:
  ca:
    image: smallstep/step-ca
    volumes:
      - "step:/home/step"
    environment:
      - DOCKER_STEPCA_INIT_NAME=Smallstep
      - DOCKER_STEPCA_INIT_DNS_NAMES=localhost,ubuntu
    ports:
      - "9000:9000"

当我运行

docker compose up
(再次,在这里使用 v2)时,我收到此错误

服务“ca”指的是未定义的卷步骤:无效的撰写项目

这是解决这个问题的正确方法吗?我想我错过了在 docker compose 项目中创建卷的额外步骤,但我不确定那会是什么,或者这是否是一个有效的用例。

docker docker-compose docker-volume
3个回答
67
投票

Compose 文件还有一个顶级

volumes:
,您需要在那里声明卷。

version: '3.8'
services:
  ca:
    volumes:
      - "step:/home/step"
    et: cetera
volumes:   # add this section
  step:    # does not need anything underneath this

还有可能的其他选项,但通常不需要指定这些选项,除非您需要重用预先存在的 Docker 命名卷或者需要非标准 Linux 挂载选项(链接的文档提供了 NFS 挂载卷的示例,例如示例)。


22
投票

引用 Compose 规范

为了避免命名卷出现歧义,相对路径应始终以

.
..
开头。

因此,使您的

VOLUME
的主机路径相对应就足够了:

services:
  ca:
    volumes:
      - ./step:/home/step

如果您不打算与其他容器共享

step
卷,则无需在顶级
volumes
键中定义它:

如果挂载是主机路径并且仅由单个服务使用,则可以将其声明为服务定义的一部分,而不是顶级

volumes
键。


0
投票

docker-compose 似乎不知道您通过命令创建的“卷”:

sudo docker volume create my_xx_volume

所以,只需手动

mkdir
创建一个文件夹和
chmod 777 <my_folder>
,那么你的mysql docker就会很好地使用它。

(在生产环境中,不要使用

chmod
而是使用
chown
来更改文件权限)

© www.soinside.com 2019 - 2024. All rights reserved.