Dockerfile VOLUME 不能反映容器内容

Dockerfile VOLUME 不能反映容器内容

Dockerfile

FROM ubuntu:18.04

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

RUN apt-get update && apt-get install -y \
curl \
git \
make \
sudo 

RUN sudo useradd -m -p $(openssl passwd -1 1) me

USER me
WORKDIR /home/me

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash \
&& . $HOME/.nvm/nvm.sh && nvm install 8.12.0

RUN mkdir myvol && touch myvol/TEST

VOLUME myvol

然后构建图像:

docker build ./ -t nodejs

然后启动新的容器:

docker run -it --rm --name nodejs nodejs:latest bash

现在我可以看到我在docker空间中创建了一个匿名卷:

/var/lib/docker/volumes/39459a1b2cf16e9d2dc2fe8fa5261186a02af75410a0e63f39e17e6e63b3ffe0

当我做:

sudo ls -asl /var/lib/docker/volumes/39459a1b2cf16e9d2dc2fe8fa5261186a02af75410a0e63f39e17e6e63b3ffe0/_data

我没看到测试文件!未命名卷是空的!

就像文档所说:

The docker run command initializes the newly created volume with any data that exists at the specified location within the base image.

为什么我看不到卷中预先存在的内容?

答案1

Dockerfile 中的 VOLUME 规范需要绝对路径而不是相对路径:

VOLUME /home/me/myvol

话虽如此,我倾向于不建议在 Dockerfile 中声明卷,因为它会破坏下游用户扩展映像的能力,并且当用户没有明确声明卷时会导致匿名卷(如您在此处所见)。相反,docker-compose.yml 示例是首选。

我还建议不要使用类似这样的名称nodejs:latest作为镜像,因为它可能会与上游镜像冲突,看到的人可能会认为这是官方 docker 镜像。请使用以用户名为前缀的镜像名称linderman/nodejs:latest来避免潜在的冲突。

相关内容