【问题标题】:pass filePath to dockerfile as variable _ nodeJS dockerode Docker将filePath作为变量传递给dockerfile _ nodeJS dockerode Docker
【发布时间】:2019-12-05 01:54:22
【问题描述】:

在我的例子中,我正在创建一个 config.json,我需要将它从主机复制到我的容器。

我发现有一些选项可以将 args 传递给我的 dockerfile。 所以第一步是:

1.创建Dockerfile:

FROM golang
WORKDIR /go/src/app
COPY . .                     /* here we have /foo directory */
COPY  $CONFIG_PATH ./foo/
EXPOSE $PORT
CMD ["./foo/run", "-config", "./foo/config.json"]

如您所见,我有 2 个变量 ["$CONFIG_PATH", "$PORT"]。

所以这些变量是动态的,来自我在 docker run 中的命令。 在这里,我需要将我的配置文件从我的主机复制到我的容器,并且我需要使用该 config.json 文件运行我的项目。

构建镜像后:

  1. 第二步:

从用户那里获取我的配置文件并使用这些变量运行 docker 映像。

let configFilePath = '/home/baazz/baaaf/config.json'
let port = "8080"
docker.run('my_image', null, process.stdout, { Env: [`$CONFIG_PATH=${configFilePath}`, `$PORT=${port}`] }).then(data => {

        }).catch(err => { console.log(err) })

我在尝试执行代码时收到此错误消息。

打开 JSON 配置时出错 (./foo/config.json):打开 ./foo/config.json: 没有这样的文件或目录。终止。

【问题讨论】:

  • 您展示的 Dockerfile 中的变量在 build 期间使用,而不是在 run 期间使用。由于它仅适用于 copyexpose,因此绝对没有必要将它们传递给您的 docker 容器。您是否检查了图像文件系统以检查配置文件是否已复制到正确的路径?我怀疑它已被复制到子目录(即CONFIG_PATH 的目录名)。

标签: node.js docker dockerode


【解决方案1】:

您通常不希望在您的 Docker 映像中像这样COPY 配置文件。您应该可以在多个环境中docker run 同一个图像而无需修改。

相反,您可以在运行映像时使用docker run -v 选项注入正确的配置文件:

docker run -v $PWD/config-dev.json:/go/src/app/foo/config.json my_image

Dockerode home page 显示等效的 Binds 选项。在 Docker Compose 中,这进入每个容器 volumes:。不要求两个路径或文件名匹配。)

由于像这样的文件路径成为人们运行容器的外部接口的一部分,您通常希望在构建时使它们可配置。选择一个固定路径并记录在该位置挂载您的自定义配置文件。

【讨论】:

  • tnx for answer 我明白了,但有一个问题:在 docker 文件中:VOLUME /test 和我的运行命令中:-v ${configFilePath}:/test/config.json 但得到这个错误:container_linux.go:346 : 启动容器进程导致 "exec: \"-v\": executable file not found in $PATH": unknown
  • 不要把VOLUME放在你的Dockerfile中;它大多只有令人困惑的副作用,是不必要的。将-v 选项放在图像名称之前而不是之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 2019-05-27
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
相关资源
最近更新 更多