【问题标题】:How does one build a docker image from the home user directory?如何从主用户目录构建 docker 映像?
【发布时间】:2021-10-20 17:02:47
【问题描述】:

我正在尝试复制我的整个主目录或至少将其提供给我的 docker build,但我收到以下错误:

error from sender: open .Trash: operation not permitted

这些是我为自己写的说明:

~/username 运行 docker build(这使得一切从 可用的用户名)例如:

/Users/miranda9 

然后运行:

docker build -t test:latest -f py_repo/pycoq_dockerfile/Dockerfile .

但是我得到了我上面提到的错误。有没有办法解决这个问题?

我的尝试基于this answer


当前 docker 文件:

# FROM ubuntu:20.04
FROM ubuntu:18.04

# after this cmd RUN pwd should print /miranda9
WORKDIR /miranda9

# The COPY instruction copies new files or directories from <src> and adds them to the filesystem of the container at the path <dest>.
COPY . .

我也希望不必每次都重新制作图像。例如最好只运行我的容器,就好像它是一个命令一样。但我也很想看到需要重建图像的解决方案。


多年前我问过的相关问题:How to use a python library that is constantly changing in a docker image or new container?


尝试 2:没有 docker 文件但使用挂载卷的解决方案

我想完全避免使用 docker 文件,但我无法让它工作:

# docker run -v /Users/miranda9:/home/miranda9 -ti continuumio/miniconda3 bash
# docker run -v /Users/miranda9:/ -ti continuumio/miniconda3 bash

给出错误:

docker: Error response from daemon: invalid volume specification: '/host_mnt/Users/miranda9:/': invalid mount config for type "bind": invalid specification: destination can't be '/'.

【问题讨论】:

  • @LMC 将在明天发布。无法访问代码。但它非常简单。现在只是 FROM ubuntu:18.04COPY . . 作为初步尝试。明天更新。
  • 通常您希望将构建上下文目录设置为尽可能接近应用程序的位置。在内部,Docker 创建了整个上下文目录的 tar 文件,并通过套接字将其发送给自己,所以像你的主目录这样的东西不是一个好的选择。你能docker build py_repo/pycoq_dockerfile,没有-f 选项吗?
  • 我猜.Trash 是一个具有特殊权限的特殊系统目录。所以你无权复制它。不知道为什么要完全复制整个用户目录,但这看起来不是一个好主意。如果可能的话,你也可以使用数组来复制精确的文件:COPY ["source_folder1", "source_file1", "./destination_folder"]。这将有助于避免复制系统文件和文件夹。
  • @rzlvmp 我有多个相互交互的不同项目的存储库。例如我有一个我的主文件夹使用的ultimate-utils 存储库和pycoq 和我的主存储库main-repo,它们都处于任一开发模式(例如conda develop .pip -e install .)。所以每当我运行我的代码时,我都希望 docker 容器拥有一切。我想最简单的破解方法是在我的家miranda/projects 中有一个特殊的文件夹,在那里我有我所有的项目,这样.Trash 和其他没有什么特别的东西可以让我工作......不知道还有什么是好主意...
  • 我也希望不必每次都重新制作图像。例如最好只是像命令一样运行我的容器。

标签: docker


【解决方案1】:

既然您提到不想每次都重新制作映像,那么仅卷映射您的主目录就足够了吗?

所以删除 WORKDIR 和 COPY 指令,只在运行 docker 时映射卷?

例如

docker run -v /Users/miranda9:/path/in/container

【讨论】:

  • 会试试看!顺便说一句,为什么那会起作用,但 COPY 却不起作用?是因为COPY 需要重新制作图像吗?顺便说一句,文件夹/path/in/container 的路径是否必须存在于容器中? (顺便说一句,如果你有最小的图像,我可以构建并尝试这将是非常棒的,并且会接受你的回答)
  • 嗯,为什么这不起作用? ` docker run -v /Users/miranda9:/ -ti continuumio/miniconda3 bash` 给了我错误docker: Error response from daemon: invalid volume specification: '/host_mnt/Users/miranda9:/': invalid mount config for type "bind": invalid specification: destination can't be '/'.?
  • 顺便说一句,如果我将内容写入我现在安装到我真正主目录的 docker 容器中......如果我编辑文件或安装等,它会修改我原始文件的内容吗?或添加文件夹文件等,如果我安装或做一般的事情?
  • 不能在docker根目录挂载主机卷。这将覆盖整个 docker 文件系统。尝试安装在 /opt 或 /miranda9
  • 并回答您的上述问题之一。是的,如果您在 docker 内修改绑定挂载上的文件,这些更改将传播到主机文件系统。这是你想要的行为吗?因为还有其他安装卷的选项。
【解决方案2】:

我认为这可以通过挂载我的本地目录来工作:

使用这个 dockerfile:

FROM ubuntu:20.04
FROM python:latest
FROM continuumio/miniconda3

MAINTAINER Miranda "miranda9_fake_email@gmail.com"

# create this dir in the docker container
RUN mkdir -p /home/miranda9/
# make it the working dir
WORKDIR /home/miranda9

然后从中构建图像:

docker build -t miranda9_playground .

然后运行docker容器,将家目录挂载到docker容器中的家目录中:

docker run -v /Users/miranda9:/home/miranda9 -ti miranda9_playground bash

最后一个-v 用于安装:-ti-t-i 一个用于标记容器/应用程序另一个用于交互模式-i。然后是从miranda9_playground 构建容器的映像名称,最后一个是shell(命令),在这种情况下是bash 在该容器内运行docker。

此 repo 中的 Docker 容器:https://github.com/brando90/ultimate-utils


我想完全避免使用 docker 文件,但我无法让它工作:

# docker run -v /Users/miranda9:/home/miranda9 -ti continuumio/miniconda3 bash
# docker run -v /Users/miranda9:/ -ti continuumio/miniconda3 bash

给出错误:

docker: Error response from daemon: invalid volume specification: '/host_mnt/Users/miranda9:/': invalid mount config for type "bind": invalid specification: destination can't be '/'.

【讨论】:

【解决方案3】:

这在 wsl2 上对我有用

/mnt$ docker run -v ~/:/home/miranda -ti continuumio/miniconda3 bash
(base) root@d7ef57cffe53:/# ls /home/miranda/
BSD  go  projects

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 2020-09-03
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多