2

我是码头工人的新手。我想了解以下问题。我一直在寻找,但我找不到我的问题的答案。

  1. 为什么我尝试复制文件时总是得到错误的路径?

  2. 这是否意味着我只能将文件从我拥有 dockerfile 的同一目录复制到 docker 映像中?有没有办法从主机上的其他目录复制文件?

  3. 有没有办法直接在 Dockerfile 中传递主机的环境变量而不使用“ARG”和 --build-arg 标志?

以下是我目前拥有的

文件结构是这样的:

/home/user1/docker 
|__ Dockerfile

在 Dockerfile 中:

From 

ARG BLD_DIR=/tmp

RUN mkdir /workdir

WORKDIR /workdir

COPY ${BLD_DIR}/a.file /workdir

我跑了

root@localhost> echo $BLD_DIR
/tmp/build <-- BLD_DIR 是自定义变量;意味着每个开发环境都不同

docker build --build-arg BLD_DIR=${BLD_DIR} -t docker-test:1.0 -f Dockerfile 

总是出错

复制失败:stat /var/lib/docker/tmp/docker-builder035089075/tmp/build/a.file:没有这样的文件或目录

4

1 回答 1

3
  1. 在 Dockerfile 中,您只能复制当前 Docker 构建上下文中可用的文件。

默认情况下,运行docker build命令的目录中的所有文件都将复制到 Docker 上下文文件夹中。

因此,当您使用ADDorCOPY命令时,您的所有路径实际上都相对于构建文件夹,如文档所述:

可以指定多个资源,但文件和目录的路径将被解释为相对于构建上下文的源。

这是自愿的,因为使用docker build不应该依赖于系统上的辅助文件来构建映像:如果在 2 台不同的机器上构建相同的 Docker 映像,则不应有所不同。

  1. 但是,您可以具有如下目录结构:

    /home/user1/
    |___file1
    |___docker/
    |___|___ Dockerfile
    

如果您docker build -t test -f docker/Dockerfile . /home/user1文件夹中运行,您的构建上下文将为/home/user1,因此您可以COPY file1在 Dockerfile 中。

  1. 出于同样的原因,您不能直接在 Dockerfile 中使用环境变量。这个想法是您的docker build命令应该“打包”在 2 个不同系统上生成相同图像所需的所有信息。但是,您可以使用 docker-compose 破解它,就像这里解释的那样:将主机环境变量传递给 dockerfile
于 2018-07-14T23:35:46.980 回答