我使用以下 Dockerfile 创建了一个 docker 镜像
FROM java:8-jdk
ENV DOCKER_HOME /docker
ENV CRAWLER_HOME /docker/crawler
RUN groupadd crawler && useradd -g crawler crawler
RUN mkdir -p ${DOCKER_HOME}
RUN mkdir -p ${CRAWLER_HOME}
COPY ./ ${CRAWLER_HOME}
RUN ls -la ${CRAWLER_HOME}/*
RUN chown -R crawler:crawler ${DOCKER_HOME} && chmod -R 755 ${DOCKER_HOME}
WORKDIR $CRAWLER_HOME
ENTRYPOINT [ "/docker/crawler/docker/Entrypoint.sh" ]
当我在没有 -v 选项的情况下运行图像时,它工作正常(docker run sampleimage:1.0)。但是当我使用 -v 运行时,它会出现以下错误
docker run -v ~/docker:/docker sampleimage:1.0
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367:
starting container process caused: exec: "/docker/crawler/docker/Entrypoint.sh": stat
/docker/crawler/docker/Entrypoint.sh: no such file or directory: unknown.
ERRO[0000] error waiting for container: context canceled
在构建映像时,我尝试在 CRAWLER_HOME 中列出该文件,并且存在 Entrypoint.sh 文件。无法找出为什么它在运行时不抛出此类文件或目录。
答案 0 :(得分:1)
/docker/crawler/docker/Entrypoint.sh 不存在于主机中,但存在于图像中。
使用与在 Linux 中安装文件系统相同的内核方法安装卷。当您挂载到包含内容的目录之上时,只要挂载存在,这些内容就看不到。对该目录的所有访问都转到挂载的文件系统。这意味着您不会将图像中的内容与主机上的内容合并,而只会看到卷中的内容。
对此的半例外是命名卷安装。在这种情况下,命名的挂载在第一次使用图像内容时被初始化。然后继续前进,那个命名的 mount 行为相同,隐藏图像的内容,认为它不那么明显,因为来自图像的文件被复制到卷中。请注意,此初始化仅在命名卷为空/新建且创建容器时发生,并且不会在每次使用卷时运行,因此您不会在以后运行时自动获取对映像的更改。>
标准建议是将您的数据与应用程序分开,将它们放在不同的文件夹中。然后为数据挂载一个卷,并在映像中包含应用程序二进制文件/脚本。