如何编写一个Dockerfile,我可以启动一个服务并运行一个shell并接受shell的参数?

weixin_38064768 2019-09-12 12:54:28
在Dockerfile中,最新的指令是: CMD sudo chown -R user:user /home/user/che && \ sudo service docker start && \ cd /home/user/che/bin/ && ./che.sh run 它有效,但我不能将更多的参数传递给./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"] 为了调用它像docker run -it –priviledged my / che -r:111.111.111.111 run,但是che.sh shell会报告内部docker不能正常工作. 我也尝试过: ENTRYPOINT ["sudo service docker start", "&&", "/home/user/che/bin/che.sh run"] 甚至: ENTRYPOINT ["sh", "-c" "sudo service docker start && /home/user/che/bin/che.sh run"] 但它会报告在$PATH中找不到sudo服务docker start,或者che.sh没有运行. 写它的正确方法是什么? >调用che.sh时应运行sudo service docker start>我需要将参数从外部传递给che.sh,就像docker run -it –priviledged my / che -r:111.111.111.111 run
...全文
998 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38066001 2019-09-12
  • 打赏
  • 举报
回复
您必须在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 将它放在Dockerfile的末尾: COPY etc/supervisor/conf.d/supervisord.conf /etc/supervisor/conf.d/ CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] 在Dockerfile旁边的etc / supervisor / conf.d / supervisord.conf中创建一个文件: [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 这是一个更复杂的supervisord.conf,可能你不需要这里的许多命令,而且你必须根据需要更改文件位置.但是,您可以看到如何从脚本的bash输出创建日志文件. 稍后您必须在该容器中使用docker exec,您可以使用以下命令实时查看日志: docker exec -it your_running_container /bin/bash -c 'tail -f /var/log/supervisord/dcheck-stdout.log' 您可以选择使用loglevel = debug在主Supervisord日志中显示子进程日志,但是这里有时间戳和注释,而不是像直接运行脚本时那样的纯bash输出. 正如你在我的scipt中看到的那样,我使用tail -f / dev / null保持容器,但这是一个不好的做法. .sh脚本应该自己保持容器的存活. 当你将你的scipt作为ENTRYPOINT [“sudo service docker start”,“&&”,“/ home / user / che / bin / check.sh run”]发送到ENTRYPOINT时,你想要更改默认的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 或者把它放在底部: ENTRYPOINT ['/bin/bash', '-c'] 将任何CMD发送到此Dockerfile后,它将由/ bin / bash -c命令运行. 还有一点需要注意的是第一个命令采用PID1,所以如果你想在我的supervisord脚本中运行没有tail -f / dev / null的.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' echo pid1> / dev / null将使用PID1和SIGTERM,SIGKILL和SIGINT将再次使用您的shell脚本. 我试图用–privileged标志远离运行Docker.您还有更多选择可以摆脱限制. 我对你的堆栈一无所知,但通常不知道如何不将Docker停靠在Container中. sudo服务docker启动是否在您的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" 在这种情况下,ENTRYPOINT最好是ENTRYPOINT [‘/ bin / bash’,’ – c’]. 在主机上运行此脚本: $cd /home/hostuser $./run -flag1 -flag2 args1 args2 args3

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧