Fre*_*ind 6 entry-point docker dockerfile
在 Dockerfile 中,最新的指令是:
CMD sudo chown -R user:user /home/user/che && \
sudo service docker start && \
cd /home/user/che/bin/ && ./che.sh run
Run Code Online (Sandbox Code Playgroud)
它有效,但我无法将更多参数传递给./che.sh.
该che.sh检查内部docker在做其他任务后开始。它可以接受多个可选参数,例如-r:111.111.111.111.
我尝试将指令修改为:
RUN sudo chown -R user:user /home/user/che && \
sudo service docker start
ENTRYPOINT ["/home/user/che/bin/che.sh"]
Run Code Online (Sandbox Code Playgroud)
为了像 那样调用它docker run -it --priviledged my/che -r:111.111.111.111 run,但che.sh外壳会报告内部docker工作不正常。
我也试过:
ENTRYPOINT ["sudo service docker start", "&&", "/home/user/che/bin/che.sh run"]
Run Code Online (Sandbox Code Playgroud)
甚至:
ENTRYPOINT ["sh", "-c" "sudo service docker start && /home/user/che/bin/che.sh run"]
Run Code Online (Sandbox Code Playgroud)
但是它会报告sudo service docker start在 $PATH 中找不到,或者che.sh没有运行。
正确的写法是什么?
sudo service docker start应该在che.sh被调用时运行che.sh,例如docker run -it --priviledged my/che -r:111.111.111.111 run您必须在 Docker 容器中使用 supervisord 才能在创建容器时使用更复杂的 shell 语法。
关于 supervisord 的 Docker 文档:https : //docs.docker.com/engine/articles/using_supervisord/
当您使用$ docker run命令创建新容器时,您可以使用更复杂的 shell 语法(您想要使用的),但是这在 systemd 服务文件(由于 systemd 中的限制)和 docker-compose .yml 文件和 Dockerfiles 中不起作用.
首先,您必须在 Dockerfile 中安装 supervisord:
RUN apt-get -y update && apt-get -y dist-upgrade \
&& apt-get -y install \
supervisor
RUN mkdir -p /var/log/supervisord
Run Code Online (Sandbox Code Playgroud)
将它放在 Dockerfile 的末尾:
COPY etc/supervisor/conf.d/supervisord.conf /etc/supervisor/conf.d/
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
Run Code Online (Sandbox Code Playgroud)
在etc/supervisor/conf.d/supervisord.confDockerfile 旁边创建一个文件:
[unix_http_server]
file=/var/run/supervisord.sock
chmod=0777
chown=root:root
username=root
[supervisord]
nodaemon=true
user=root
environment=HOME="/root",USER="root"
logfile=/var/log/supervisord/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisord
logfile_maxbytes=10MB
loglevel=info
[program:keepalive]
command=/bin/bash -c 'echo Keep Alive service started... && tail -f /dev/null'
autostart=true
autorestart=true
stdout_events_enabled=true
stderr_events_enabled=true
stdout_logfile=/var/log/supervisord/keepalive-stdout.log
stdout_logfile_maxbytes=1MB
stderr_logfile=/var/log/supervisord/keepalive-stderr.log
stderr_logfile_maxbytes=1MB
[program:dcheck]
command=/bin/bash -c 'chmod +x /root/dcheck/repo/dcheck.sh && cd /root/dcheck/repo && ./dcheck.sh'
autostart=true
autorestart=true
stdout_events_enabled=true
stderr_events_enabled=true
stdout_logfile=/var/log/supervisord/dcheck-stdout.log
stdout_logfile_maxbytes=10MB
stderr_logfile=/var/log/supervisord/dcheck-stderr.log
stderr_logfile_maxbytes=1MB
Run Code Online (Sandbox Code Playgroud)
这是一个更复杂的 supervisord.conf 并且您可能不需要这里的许多命令,而且您必须根据需要更改文件位置。但是,您可以看到如何从脚本的 bash 输出创建日志文件。
稍后您必须docker exec在该容器中,您可以使用以下命令实时查看日志:
docker exec -it your_running_container /bin/bash -c 'tail -f /var/log/supervisord/dcheck-stdout.log'
Run Code Online (Sandbox Code Playgroud)
您可以选择在主 supervisord 日志中使用 显示子进程日志loglevel=debug,但是这充满了时间戳和注释,而不是像直接运行脚本时那样的纯 bash 输出。
正如你在我的 scipt 中看到的,我用 来保持容器的存活tail -f /dev/null,但是这是一个不好的做法。.sh 脚本应该让你的容器自己保持活动状态。
当您将您的 scipt 作为 ENTRYPOINT 发送到 ENTRYPOINT 时ENTRYPOINT ["sudo service docker start", "&&", "/home/user/che/bin/che.sh run"],您希望将默认的 docker ENTRYPOINT 从 更改/bin/sh -c为sudo(另外,使用完整的位置名称)。
有两种方法可以更改 Dockerfile 中的 docker ENTRYPOINT。一种是将其放在 Dockerfile 的 head 部分:
RUN ln -sf /bin/bash /bin/sh && ln -sf /bin/bash /bin/sh.distrib
Run Code Online (Sandbox Code Playgroud)
或者把它放在底部:
ENTRYPOINT ['/bin/bash', '-c']
Run Code Online (Sandbox Code Playgroud)
当您将任何内容CMD发送到此 Dockerfile 后,它将通过/bin/bash -c命令运行。
还有一点要注意的是,第一个命令需要 PID1,所以如果你想在没有tail -f /dev/null我的 supervisord 脚本的情况下运行 .sh脚本,它将占用 PID1 进程位置并且 CTRL+C 命令将不起作用。您必须从另一个 shell 实例关闭容器。
但是,如果您使用以下命令运行命令:
[program:dcheck]
command=/bin/bash -c 'echo pid1 > /dev/null && chmod +x /root/dcheck/repo/dcheck.sh && cd /root/dcheck/repo && ./dcheck.sh'
Run Code Online (Sandbox Code Playgroud)
echo pid1 > /dev/null 将采用 PID1 和 SIGTERM,SIGKILL 和 SIGINT 将再次与您的 shell 脚本一起工作。
我尽量避免使用--privilegedflag运行 Docker 。您有更多选择来摆脱这些限制。
我对您的堆栈一无所知,但通常最好不要在容器中 dockerise Docker。sudo service docker start在您的 Dockerfile 中是否有特定原因?
我对这个容器一无所知,它必须是活的吗?因为如果没有,则有一个更简单的解决方案,仅在必须从命令行处理某些内容时才运行容器。将带有名的主机对这个文件run让我们在说/home/hostuser的文件夹,并给它chmod +x run:
#!/bin/bash
docker run --rm -it -v /home/hostuser/your_host_shared_folder/:/root/your_container_shared_folder/:rw your_docker_image "echo pid1 > /dev/null && chmod +x /root/script.sh && cd /root && ./script.sh"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ENTRYPOINT 首选为ENTRYPOINT ['/bin/bash', '-c']。
在主机上运行此脚本:
$ cd /home/hostuser
$ ./run -flag1 -flag2 args1 args2 args3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10915 次 |
| 最近记录: |