我尝试在 CentOS 上运行如下所示的脚本(
myScript.R
):
print("AAS")
Dockerfile如下:
FROM rocker/r-base:latest
COPY /myScript.R /myScript.R
RUN Rscript /myScript.R
在Windows上它运行正确,但在CentOS命令上
docker run myName/17_08
返回错误:
Fatal error: you must specify '--save', '--no-save' or '--vanilla'
当我使用选项时它返回错误:
$ docker run myName/17_08 --no-save
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "--no-save": executable file not found in $PATH: unknown.
ERRO\[0000\] error waiting for container:
我可以做什么来在 CentOS 上运行这个容器?
坦率地说,我不知道它在 Windows 上是如何工作的,因为
RUN
是构建时的指令。当您 docker run
时,在这种情况下,将执行基础映像中的 CMD
,即 [R]
,如您在代码中看到的 。
如果您想在构建时运行脚本,请遵循运行指令(确保文件路径有效),它将看起来像这样:
$ docker build --progress=plain --no-cache -t tester:latest .
#0 building with "default" instance using docker driver
#1 [internal] load .dockerignore
#1 transferring context:
#1 transferring context: 2B done
#1 DONE 0.2s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 108B done
#2 DONE 0.2s
#3 [internal] load metadata for docker.io/rocker/r-base:latest
#3 DONE 0.5s
#4 [1/3] FROM docker.io/rocker/r-base:latest@sha256:eb220139e120247ff6208e2c2556c5142250c7de02a5ea4c77151cbfdffd186e
#4 CACHED
#5 [internal] load build context
#5 transferring context: 31B done
#5 DONE 0.1s
#6 [2/3] COPY myScript.R .
#6 DONE 0.3s
#7 [3/3] RUN Rscript myScript.R
#7 1.153 [1] "AAS"
#7 DONE 1.4s
#8 exporting to image
#8 exporting layers
#8 exporting layers 0.4s done
#8 writing image sha256:904e0a8893b593c2c73423bb7b9705c63135172fac909789aea735b0c121139d 0.0s done
#8 naming to docker.io/library/tester:latest 0.1s done
#8 DONE 0.5s
您可以在其中看到脚本在第 7 层运行。
如果您想在运行时运行脚本,基本上有三种不同的选项:使用
CMD
、使用 ENTRYPOINT
或将命令添加到 docker run
指令中。要了解这些差异,stackoverflow 上有一个很好的Answer。
CMD
为此,您需要像这样调整 Dockerfile:
FROM rocker/r-base:latest
COPY myScript.R .
CMD Rscript myScript.R
您可以看到脚本不再在构建时执行:
$ docker build --progress=plain --no-cache -t tester:latest .
#0 building with "default" instance using docker driver
#1 [internal] load .dockerignore
#1 transferring context: 2B done
#1 DONE 0.2s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 108B done
#2 DONE 0.2s
#3 [internal] load metadata for docker.io/rocker/r-base:latest
#3 DONE 0.9s
#4 [1/2] FROM docker.io/rocker/r-base:latest@sha256:eb220139e120247ff6208e2c2556c5142250c7de02a5ea4c77151cbfdffd186e
#4 CACHED
#5 [internal] load build context
#5 transferring context: 31B done
#5 DONE 0.1s
#6 [2/2] COPY myScript.R .
#6 DONE 0.4s
#7 exporting to image
#7 exporting layers
#7 exporting layers 0.1s done
#7 writing image sha256:1a5f360b2406fd7617aa56b4a4ac91261672cb0fe5760b1c2dc87776556cd334 0.0s done
#7 naming to docker.io/library/tester:latest 0.0s done
#7 DONE 0.2s
现在您可以运行您的图像,它将使用您指定的命令执行脚本:
$ docker run --rm tester
[1] "AAS"
与上面类似,您可以在图像中使用
ENTRYPOINT
指令。
您的 Dockerfile 如下所示:
FROM rocker/r-base:latest
COPY myScript.R .
ENTRYPOINT Rscript myScript.R
并且构建的输出也不执行脚本:
$ docker build --progress=plain --no-cache -t tester:latest .
#0 building with "default" instance using docker driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 115B done
#1 DONE 0.2s
#2 [internal] load .dockerignore
#2 transferring context: 2B done
#2 DONE 0.3s
#3 [internal] load metadata for docker.io/rocker/r-base:latest
#3 DONE 0.6s
#4 [1/2] FROM docker.io/rocker/r-base:latest@sha256:eb220139e120247ff6208e2c2556c5142250c7de02a5ea4c77151cbfdffd186e
#4 CACHED
#5 [internal] load build context
#5 transferring context: 31B done
#5 DONE 0.1s
#6 [2/2] COPY myScript.R .
#6 DONE 0.4s
#7 exporting to image
#7 exporting layers
#7 exporting layers 0.1s done
#7 writing image sha256:00a6237bc2ce599c55175db0a1cb3753cf32be092499f22959b2b91cbf05554b 0.0s done
#7 naming to docker.io/library/tester:latest 0.0s done
#7 DONE 0.2s
然后再次运行时,您将收到预期的输出:
$ docker run --rm tester
[1] "AAS"
最后但并非最不重要的一点是,您可以将图像缩小一点:
FROM rocker/r-base:latest
COPY myScript.R .
这使您的构建过程变得更短:
$ docker build --progress=plain --no-cache -t tester:latest .
#0 building with "default" instance using docker driver
#1 [internal] load .dockerignore
#1 transferring context: 2B done
#1 DONE 0.2s
#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 83B done
#2 DONE 0.2s
#3 [internal] load metadata for docker.io/rocker/r-base:latest
#3 DONE 0.5s
#4 [1/2] FROM docker.io/rocker/r-base:latest@sha256:eb220139e120247ff6208e2c2556c5142250c7de02a5ea4c77151cbfdffd186e
#4 CACHED
#5 [internal] load build context
#5 transferring context: 31B done
#5 DONE 0.1s
#6 [2/2] COPY myScript.R .
#6 DONE 0.3s
#7 exporting to image
#7 exporting layers
#7 exporting layers 0.2s done
#7 writing image sha256:cb724210554cce6c9ef0fc93e4bdef5b39c1782527ba21c28f5ec13e5850a637 0.0s done
#7 naming to docker.io/library/tester:latest 0.0s done
#7 DONE 0.2s
现在,当您运行容器时,传递参数:
$ docker run --rm tester Rscript myScript.R
[1] "AAS"