【问题标题】:Execute script when docker container startdocker容器启动时执行脚本
【发布时间】:2018-04-16 12:20:05
【问题描述】:

我想启动带有“centos:latest”图像的容器并执行我的脚本。使用 docker cp 命令复制脚本。

docker create --name centos1 centos:latest
docker cp . 5db38b908880:/opt   ---> scripts are in current directory, hence .
docker commit centos1 new_centos1  --> now new_centos1 image has scripts

现在我想用要执行的脚本启动新容器:我尝试了以下命令:

docker run -ti --rm --entrypoint "cd /opt && deploy_mediainfo_lambda.sh" new_centos1:latest

docker run -ti --rm new_centos1:latest "cd /opt && deploy_mediainfo_lambda.sh"

以上两个命令都失败了:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:296: starting container process caused "exec: \"cd /opt && deploy_mediainfo_lambda.sh\": stat cd /opt && deploy_mediainfo_lambda.sh: no such file or directory": unknown.
ERRO[0000] error waiting for container: context canceled 

如果在启动容器时使用 bash 命令,我可以在容器内使用“可执行路径”/“可执行名称”运行我的脚本,但在命令行启动容器时我不能这样做

docker run -ti --rm new_centos1:latest bash
[root@c34207f3f1c4 /]# ./opt/deploy_mediainfo_lambda.sh 

如果使用下面的命令,直接调用可执行文件,它会给出路径错误。

docker run -ti --rm new_centos1:latest "deploy_mediainfo_lambda.sh"

docker: Error response from daemon: OCI runtime create failed: container_linux.go:296: starting container process caused "exec: \"deploy_mediainfo_lambda.sh\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 

也不确定在启动容器时从命令行设置 $PATH。

我知道,使用 Dockerfile 这是可以实现的,例如:

  1. 可以使用 ENV 设置路径,
  2. 可以使用 ADD 或 COPY 复制可执行文件
  3. 使用 CMD 或 ENTRYPOINT 运行可执行文件

如何使用 docker 命令行来实现?

【问题讨论】:

  • 如果您将"/opt/deploy_mediainfo_lambda.sh" 作为命令传递会发生什么?
  • 它给出了以下错误:standard_init_linux.go:195: exec 用户进程导致“exec 格式错误”
  • deploy_mediainfo_lambda.sh 的第一行是什么?
  • 导出语句如:export AWS_DEFAULT_OUTPUT=json
  • 第一行应该指定一个解释器,例如#!/bin/bash.

标签: bash


【解决方案1】:

谢谢melpomene

这是我的 bash 脚本,用于在容器内自动执行脚本,在复制它们之后,全部使用 docker 命令。

 # Start docker container
docker create --name mediainfo_docker centos:latest
# copy script files
docker cp . mediainfo_docker:/opt
# save container with the new image, which contains all scripts.
docker commit mediainfo_docker mediainfo_docker_with_scripts

# Now run scripts inside docker container
docker run -ti --rm  mediainfo_docker_with_scripts:latest /opt/deploy_mediainfo_lambda.sh

因为 deploy_mediainfo_lambda.sh 是一个脚本,它的第一行是: #!/bin/bash

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2021-05-17
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多