Docker 在 CentOS 上运行

问题描述 投票:0回答:1

我尝试在 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 上运行这个容器?

docker centos
1个回答
0
投票

简介

坦率地说,我不知道它在 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 执行

与上面类似,您可以在图像中使用

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"

通过 docker run 执行

最后但并非最不重要的一点是,您可以将图像缩小一点:

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"
© www.soinside.com 2019 - 2024. All rights reserved.