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
来避免潜在的冲突。