Dockerfile VOLUME不反映容器内容

林德曼

Docker文件

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.

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

米奇

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

VOLUME /home/me/myvol

就是说,我倾向于建议不要在Dockerfile中声明一个卷,因为当用户未如您在此处看到的那样显式声明该卷时,它破坏了下游用户扩展映像的能力并导致了匿名卷。相反,首选docker-compose.yml示例。

我还建议不要使用像nodejs:latest您的映像这样的名称,因为它可能与上游映像冲突,并且有人认为它可能是官方的docker映像。使用带有用户名前缀的图像名称,linderman/nodejs:latest以避免潜在的冲突。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章