来自Dockerfile的.sh脚本RUN的结果未保存到映像

时间:2018-11-13 10:09:18

标签: shell docker dockerfile

RUN ["./run.sh"]之后,从脚本内部可以看到run.sh生成的文件夹,但是一旦Docker继续,它就会丢失。

预期行为: 我想访问由run.sh脚本生成的 public / 文件夹。

Dockerfile

  ...
  RUN mkdir -p /opt/site
  WORKDIR /opt/site
  VOLUME /opt/site
  COPY . .

  RUN ["chmod", "+x", "./run.sh"]
  RUN ["./run.sh"]
  RUN pwd
  RUN ls
  RUN ls public

  FROM nginx
  COPY --from=build-stage /opt/site/public /usr/share/nginx/html

脚本

  #!/usr/bin/env bash
  rm -rf public/ node_modules/ node_modules/.bin/ package-lock.json yarn.lock
  npm install
  ls
  touch newfile.txt
  npm run build
  ls
ls之后的run.sh脚本中

build公共文件夹存在。

...
Generated public/sw.js, which will precache 6 files, totaling 197705 bytes.
info Done building in 44.842 sec
*ls*
Dockerfile
config
gatsby-config.js
gatsby-node.js
newfile.txt
node_modules
package-lock.json
package.json
postcss.config.js
public
run.sh
src
static
tailwind.css
tailwind.js

ls从Dockerfile内部。 public 文件夹丢失,尝试与之交互会导致失败。

Removing intermediate container 1692fb171673
 ---> 474d83267ccb
Step 10/14 : RUN pwd
 ---> Running in 7c351b151904
/opt/site
Removing intermediate container 7c351b151904
 ---> bae37da8b513
Step 11/14 : RUN ls
 ---> Running in 384daf575cae
Dockerfile
config
gatsby-config.js
gatsby-node.js
package-lock.json
package.json
postcss.config.js
run.sh
src
static
tailwind.css
tailwind.js
Removing intermediate container 384daf575cae
 ---> 1f6743a4adc1
Step 12/14 : RUN ls public
 ---> Running in 7af84c5d72a0
ls: cannot access public: No such file or directory
The command '/bin/sh -c ls public' returned a non-zero code: 2
ERROR: Job failed: exit code 2

1 个答案:

答案 0 :(得分:3)

您已经使用所选目录创建了一个卷:

CmdOpenDetailEmployee

在图像中定义时,将为从该图像创建的每个容器创建一个卷。如果您未指定卷的源(在构建时无法指定),则docker将创建一个匿名卷。不论是命名卷还是匿名卷,docker都会将内容初始化为该位置的映像。

RUN命令的结果如下:

  • 创建一个临时容器
  • 该临时容器运行您所请求的命令并在继续之前验证退出代码
  • 如果成功,则docker将捕获映像与容器之间的差异结果。这主要是容器特定的读/写文件系统层。但是,它不包含任何外部卷。

此行为是documented by docker

  
      
  • 从Dockerfile内更改卷::如果在声明了卷后有任何构建步骤更改了卷中的数据,则这些更改将被丢弃。
  •   

我的标准建议是从Dockerfile中删除任何卷定义。如果需要卷,请在运行时使用docker compose文件进行定义。这样可以扩展映像,并防止匿名卷使文件系统混乱。