在容器内运行 shell 脚本

Posted

技术标签:

【中文标题】在容器内运行 shell 脚本【英文标题】:Run shell script inside a container 【发布时间】:2015-08-19 06:44:23 【问题描述】:

我使用lemonlatte / docker-webvirtmgr 作为基础文件,但问题是没有为用户www-data 配置ssh 密钥,所以我编写了以下shell 脚本:

#!/bin/sh

if [ ! -d "/var/local/webvirtmgr/nginxhome" ]; then
mkdir /var/local/webvirtmgr/nginxhome
chown -R www-data:www-data /var/local/webvirtmgr/nginxhome
usermod -d /var/local/webvirtmgr/nginxhome www-data
su - www-data -s /bin/bash -c "ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ''"
su - www-data -s /bin/bash -c "touch /var/local/webvirtmgr/nginxhome/.ssh/config && echo -e 'StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null' >> /var/local/webvirtmgr/nginxhome/.ssh/config"
su - www-data -s /bin/bash -c "chmod 0600 ~/.ssh/config"
fi

之后我将这两个语句添加到 dockerfile 中:

ADD setupssh.sh /webvirtmgr/setupssh.sh
RUN /bin/sh -c "/webvirtmgr/setupssh.sh"

我已经试过 CMD /webvirtmgr/setupssh.sh, RUN /webvirtmgr/setupssh.sh 但没有成功...

当我在容器内手动运行脚本时,它工作正常。

这里有什么问题?

问候

更新: 这是维护者的repo链接:link

更新 2: dockerfile的构建成功了,我把语句放在了:

RUN apt-get -ys clean
<statements were here>
WORKDIR / 

【问题讨论】:

你能分享你的 dockerfile 吗? 您在尝试构建修改后的 Dockerfile 时是否遇到错误,您已在其中添加了这两行? 刚刚尝试使用相同的两行添加行重新创建您的 docker 文件,我能够毫无问题地运行它。首先我得到“/bin/sh: 1: /webvirtmgr/setupssh.sh: Permission denied” -> 更改 chmod,我能够调用容器内的 shell 脚本 【参考方案1】:

目录/var/local/webvirtmgr 被定义为一个

 VOLUME /var/local/webvirtmgr

因此,此目录是正在运行的容器中的 mountpoint,您添加到其中的内容会被覆盖。

您必须使用不同的目录,然后您的脚本才能工作。

这是一个 Dockerfile 来测试它:

FROM lemonlatte/docker-webvirtmgr 
RUN mkdir /var/local/webvirtmgr2
RUN touch /var/local/webvirtmgr2/t && touch /var/local/webvirtmgr/t
RUN ls -la //var/local/webvirtmgr
RUN ls -la /var/local/webvirtmgr2

输出:

Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon 
Step 0 : FROM lemonlatte/docker-webvirtmgr
 ---> 18e2839dffea
Step 1 : RUN mkdir /var/local/webvirtmgr2
 ---> Running in d7a1e897108e
 ---> cc029293525e
Removing intermediate container d7a1e897108e
Step 2 : RUN touch /var/local/webvirtmgr2/t && touch /var/local/webvirtmgr/t
 ---> Running in 1a1375651fa7
 ---> e314c2529d90
Removing intermediate container 1a1375651fa7
Step 3 : RUN ls -la //var/local/webvirtmgr
 ---> Running in 5228691c84f5
total 8
drwxr-xr-x 2 www-data www-data 4096 Jun  6 09:22 .
drwxr-xr-x 6 root     root     4096 Jun  6 09:22 ..
 ---> ec4113936961
Removing intermediate container 5228691c84f5
Step 4 : RUN ls -la /var/local/webvirtmgr2
 ---> Running in a6d2a683391a
total 8
drwxr-xr-x 2 root root 4096 Jun  6 09:22 .
drwxr-xr-x 6 root root 4096 Jun  6 09:22 ..
-rw-r--r-- 1 root root    0 Jun  6 09:22 t
 ---> 3cb98c5c1baf
Removing intermediate container a6d2a683391a
Successfully built 3cb98c5c1baf

【讨论】:

以上是关于在容器内运行 shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

docker容器启动自动启动shell脚本

如何为在 docker 容器内运行的 corda 节点运行迁移脚本?

如何在 Docker 容器内的 CockroachDB 中运行 SQL 脚本?

shell脚本内调用另外一个shell脚本的几种方法

shell脚本怎么生成运行日志

Docker 容器需要很长时间才能通过 shell 脚本启动