在RUN ["./run.sh"]
之后,可以从脚本内部看到run.sh
生成的文件夹,但是一旦Docker继续运行,该文件夹就会丢失。
预期的行为:
我想访问run.sh
脚本生成的 public / 文件夹。
Docker文件
...
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
Dockerfile内部的
ls
。缺少公共(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
最佳答案
您已经使用所选目录创建了一个卷:
VOLUME /opt/site
在镜像中定义时,将为从该镜像创建的每个容器创建一个卷。如果您未指定卷的源(在构建时无法指定),则docker将创建一个匿名卷。对于命名卷和匿名卷,docker会将其内容初始化为该位置的镜像。
RUN命令的结果如下:
此行为是documented by docker:
我的标准建议是从Dockerfile中删除任何卷定义。 如果需要卷,请在运行时使用诸如docker compose文件之类的文件对其进行定义。这允许扩展镜像,并防止匿名卷使文件系统混乱。