在容器内运行 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 容器内运行的 corda 节点运行迁移脚本?