如何在启动时启动 Docker for Mac 守护进程?

2024-02-17

我想让 Docker for Mac 在启动时启动,而不是在登录时启动。我该怎么做呢?我想创建一个LaunchDaemon,我只是不知道要启动什么程序。

我看到的所有例子似乎都使用docker-machine定义一个虚拟机,但文档现在说docker-machine如果您想使用安装 Docker 时创建的默认虚拟机,现在不是最佳选择,因为 Docker for Mac 不使用docker-machine创建虚拟机。

原因是我想启动 Docker 在启动时运行 Jenkins 和 Nexus 容器,因为该服务器将用作 CI 服务器。 Docker GUI 具有登录时启动的首选项,这与启动时启动不同。

我正在运行 OSX Sierra。


TL;DR将 Docker for Mac 作为独立服务运行是不支持.

而是在 VirtualBox VM 中运行 Docker,可以通过创建普通 VM 或使用docker-machine. 然后将 Virtualbox VM 设置为在启动时运行 https://mikkel.hoegh.org/2010/12/23/run-virtualbox-boot-mac-os-x/.

这是我用于 Virtualbox 的 LaunchAgent:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>vm.dockervm</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/VBoxHeadless</string>
      <string>-s</string>
      <string>dockervm_default_1667177741</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>me</string>
    <key>WorkingDirectory</key>
    <string>/Users/me</string>
    <key>StandardErrorPath</key>
    <string>/Users/me/log/vm/dockervm.log</string>
    <key>StandardOutPath</key>
    <string>/Users/me/log/vm/dockervm.log</string>
  </dict>
</plist>

满载:

launchctl load /Users/matt/Library/LaunchAgents/vm.dockervm.plist

尝试 Docker for Mac 设置...

Docker for Mac 应用程序创建一个 launchd 服务:

○→ launchctl list | grep -i docker
-   0   com.docker.helper
78105   0   com.docker.docker.52512

该服务有以下详细信息:

○→ launchctl list com.docker.docker.52512
{
    "LimitLoadToSessionType" = "Aqua";
    "Label" = "com.docker.docker.52512";
    "TimeOut" = 30;
    "OnDemand" = true;
    "LastExitStatus" = 0;
    "PID" = 78105;
    "Program" = "/Applications/Docker.app/Contents/MacOS/Docker";
    "ProgramArguments" = (
        "/Applications/Docker.app/Contents/MacOS/Docker";
    );
    "PerJobMachServices" = {
        "com.apple.tsm.portname" = mach-port-object;
        "com.apple.CFPasteboardClient" = mach-port-object;
        "com.apple.coredrag" = mach-port-object;
        "com.apple.axserver" = mach-port-object;
    };
};

并具有以下进程树:

○→ pstree -p 78105
-+= 00001 root /sbin/launchd
 \-+= 78105 matt /Applications/Docker.app/Contents/MacOS/Docker
   \-+= 78118 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30
     |--- 78119 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30
     |--= 78120 matt com.docker.db --url fd://3 --git /Users/matt/Library/Containers/com.docker.docker/Data/database
     |--= 78121 matt com.docker.osxfs --address fd:3 --connect /Users/matt/Library/Containers/com.docker.docker/Data/@connect --control fd:4 --volume-control
     |--= 78122 matt com.docker.slirp --db /Users/matt/Library/Containers/com.docker.docker/Data/s40 --ethernet fd:3 --port fd:4 --introspection fd:5 --diagn
     |-+= 78123 matt com.docker.osx.hyperkit.linux
     | \--- 78125 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux
     \-+= 78124 matt com.docker.driver.amd64-linux -db /Users/matt/Library/Containers/com.docker.docker/Data/s40 -osxfs-volume /Users/matt/Library/Containers
       |--- 78126 matt /Applications/Docker.app/Contents/MacOS/com.docker.driver.amd64-linux -db /Users/matt/Library/Containers/com.docker.docker/Data/s40 -o
       \--- 78130 matt /Applications/Docker.app/Contents/MacOS/com.docker.hyperkit -A -m 2048M -c 3 -u -s 0:0,hostbridge -s 31,lpc -s 2:0,virtio-vpnkit,uuid=

第一个问题是/Applications/Docker.app/Contents/MacOS/Docker是位于托盘中而不是虚拟机中的 GUI 应用程序,因此在启动时很难运行。第一个后代/Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux看起来更像是管理虚拟机的东西,所以我们将从这里开始。

获取hyperkit进程的完整命令

○→ ps -fp 78105
  UID   PID  PPID   C STIME   TTY           TIME CMD
  501 78105 82644   0  2:08am ??         0:00.03 /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30

获取进程的工作目录

○→ sudo lsof -p 78105 | grep cwd
com.docke 78105 matt  cwd      DIR                1,4       748 63186601 /Users/matt/Library/Containers/com.docker.docker/Data

创建launchd plist文件/Library/LaunchDaemons/com.you.docker.plist包含详细信息

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
    <string>com.you.docker</string>
  <key>ProgramArguments</key>
    <array>
      <string>/Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux</string>
      <string>-watchdog</string>
      <string>fd:0</string>
      <string>-max-restarts</string>
      <string>5</string>
      <string>-restart-seconds</string>
      <string>30</string>
    </array>
  <key>UserName</key>
    <string>youruser</string>
  <key>WorkingDirectory</key>
    <string>/Users/youruser/Library/Containers/com.docker.docker/Data</string>
  <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

您可以加载哪个

sudo launchctl load -w /Library/LaunchDaemons/com.you.docker.plist

然后……什么也没有。检查日志

○→ tail /var/log/system.log
Mar  7 02:23:26 mac Docker[87728]: Acquired task manager lock
Mar  7 02:23:26 mac Docker[87728]: Maximum number of file descriptors is 10240
Mar  7 02:23:26 mac Docker[87728]: Failed to read watchdog handshake
Mar  7 02:23:26 mac com.apple.xpc.launchd[1] (com.you.docker[87728]): Service exited with abnormal code: 1

您会注意到我们正在运行的命令指定了一个选项-watchdog fd:0这将是stdinhyperkit 进程的一部分,因此可能缺少某些内容。

如果我再次正常运行 Docker,并查看 hyperkit 进程在工作时的 FD 0 是什么

○→ sudo lsof -p 88360
COMMAND     PID USER   FD     TYPE             DEVICE  SIZE/OFF     NODE NAME
com.docke 88360 matt    0     PIPE 0xff80ce577ca2ed91     16384          ->0xff80ce5776aa8d51

然后看着PIPE 0xff80ce577ca2ed91在整个系统中,您将看到主 Docker 进程为许多进程打开了管道。

○→ sudo lsof | grep 0xff80ce577ca2ed91
COMMAND     PID             USER   FD      TYPE             DEVICE    SIZE/OFF     NODE NAME
Docker    88349             matt   13      PIPE 0xff80ce5776aa8d51       16384          ->0xff80ce577ca2ed91
com.docke 88360             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88362             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88363             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88364             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88365             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88366             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51

尝试再次加载服务而不使用-watchdog fd:0选项会导致相同的错误。

所以看起来主 Docker 应用程序做了一些运行虚拟机所需的设置。我一直无法找到任何涉及的源代码watchdog选项所以不确定它的期望是什么。

也许可以提出问题或功能请求https://github.com/docker/for-mac https://github.com/docker/for-mac从应用程序获取独立运行虚拟机的详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在启动时启动 Docker for Mac 守护进程? 的相关文章

  • 无法连接到 macOS 上的 Docker 守护进程

    我通常更喜欢使用brew 来管理我的OSX 上的应用程序 我能够安装 docker docker compose 和 docker machine docker version Docker version 17 05 0 ce build
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何判断我是否通过脚本登录到私有 Docker 注册表?

    如何判断我是否通过脚本登录到私有 Docker 注册表服务器 换句话说 有docker login some registry com已成功运行 并且仍然有效 注意 我问的是任意私有注册表 而不是docker io注册表 如果 docker
  • 超类与类SpecificationPolicy不匹配

    我得到了一个superclass mismatch for class SpecificationPolicy尝试安装或升级某些brew 软件包时出错 例如 更新安装 supabase CLI 时 brew install supabase
  • 在 Mac 上使用 Eclipse 进行 C++ 调试器

    当我最终设置我的 mac 来使用 eclipse 后 我无法调试 我尝试通过谷歌寻求帮助 但没有一个答案对我有用 所以 我需要有人帮助我在 eclipse 上安装和使用 c c 调试器 我安装了 Xcode 5 0 感谢您的帮助 Roy 您
  • Docker 教程入门第 4 部分连接被拒绝

    我不明白我错过了什么 docker compose yml version 3 services web replace username repo tag with your name and image details image sv
  • iPad - 无法在框架内滚动

    我无法滚动 iPad Safari 中框架内调用的 pdf 我已经尝试过两件事 2 指滚动 使用对象 嵌入代替框架 但这是行不通的 事实上我已经尝试了很多东西 溢出 高度等等 请帮我 先感谢您 根据这篇文章http support appl
  • docker 容器是否即时获取代码更改?

    我已经启动并运行了我的 docker 容器 有一个容器运行一些 python 代码 我发现它导致了一些错误 我想将一些代码行 主要是更多日志 添加到该特定容器内的 python 脚本中 我想进入容器docker exec ti contai
  • 如何管理AWS ECS中docker镜像的版本?

    AWS ECS 服务指向一个任务定义 其中包含 docker 镜像的名称 包括标签 因此 当我创建新版本的 docker 映像时 我有两种可能性 将任务定义更新到新版本 然后更新服务以指向任务定义的新版本 使用一些标签指向最后一个版本 假设
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 下载Xcode? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我刚刚升级到 OS X Mavericks 我很高兴能够使用所有新的 Mavericks 技术 我只有
  • 当所选选项是下拉列表中已选择的选项时如何接收事件?

    动机 我想动态加载一个select使用来自 AJAX 调用的值 并允许用户select加载后列表中的第一项after它获得焦点 现在 第一项是selected项目 当您单击下拉列表并单击第一项时 什么也没有发生 我无法添加任何无效选择的占位
  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • 如何在运行 .net Core 模板的 Windows docker 容器和 Windows 主机中安装开发证书?

    我已使用 Visual Studio 模板添加 Docker 支持 并且用户机密具有证书的密码 并且用户机密和证书作为卷安装在docker compose override yml volumes APPDATA ASP NET Https
  • XCode 4.2.1 在 Lion 10.7.2 上启动时崩溃

    这周我买了大约 10 年来的第一台 Mac 是的 这是一台二手 Mac Pro 2x2GHz 双核 Xeon 2GB RAM 它全新安装了 Mac OS X Lion 10 7 2 我只安装了 OmniOutlner Pro Textmat
  • 错误:执行 gem 时... (Gem::FilePermissionError)

    我检查了所有其他类似的答案 没有一个与我的完全一样 这些解决方案也不适合我 gem environment and sudo gem environment给出相同的结果 RubyGems Environment RUBYGEMS VERS
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • MacOS 10.15 (Catalina) 中的 ASWebAuthenticationSession

    我正在尝试实施新的ASWebAuthenticationSession在 MacOS 10 15 中 我对callbackURLScheme 头文件为ASWebAuthenticationSession says 回调 URL 通常具有自定
  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • Docker 警告:无法从守护进程获取默认注册表端点

    在 Windows 10 上 当我调用 docker 命令时 docker pull mongo windowsservercore 我得到以下输出 Warning failed to get default registry endpoi

随机推荐

  • 如何从 Linux 访问 Team Foundation Server (TFS)

    如果这个问题不是特定于 VCS 的 因此程序员比系统管理员更了解这种问题 那么我会问有关服务器故障或超级用户的问题 也就是说 如何从 Linux 访问 TFS 是否有一个可以在 Linux 上运行的客户端应用程序 或者一个可以在 Windo
  • SQL Server 的数据生成器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 过滤 Pandas 数据框聚合

    我有一个 pandas 数据框 我对其进行分组 然后执行聚合计算以获得平均值 grouped df groupby year month company means grouped agg size mean 这给了我一个数据框 但我似乎无
  • Angular/Typescript - 该表达式不可构造。类型“MoveDataClass”没有构造签名

    我正在使用 3 种方法创建一个类来创建该类的新实例 但是当我尝试这样做时 会出现以下错误 Angular Typescript 该表达式不可构造 类型 MoveDataClass 没有构造签名 我做错了什么 班上 export class
  • Emacs 重新排列分割窗格

    如果我在 终端 Emacs 中工作并且使用水平分割在屏幕上有 2 个缓冲区
  • 属性表模式与将所有属性存储在 json 列中[重复]

    这个问题在这里已经有答案了 我想要一些关于模型可以在通过关系访问的属性表中拥有的所有属性 使用 Laravel 关系 与将所有属性 设置存储在同一个表中但在 json 列中的反馈 目前 我的应用程序有一个名为 设置 的属性表 它本质上也是多
  • Django“xxxxxx 对象”在管理操作侧边栏中显示自定义

    我想更改管理员最近更改侧边栏显示添加的 对象 名称的默认行为 参考下图 我想更改它们在管理中的命名方式 理想情况下 我希望能够将其从 MyModelName 对象 更改为 策略 对象示例中的 策略 策略的 策略名称 字段的值 我在想 uni
  • htaccess url 重写,url 中包含多个变量

    我想在我的 htaccess 文件上制定一些 url 重写规则 以便此链接 http myseite com index php var1 value1 var2 value2会变成 http myseite com var1 value2
  • 在 Webpack Visual Studio 2017 .NET Core 2.2 捆绑的 Chrome 中调试 Typescript

    有几个问题 但大多数答案似乎是 如果你有 VS 2017 现在应该是默认的 我的调试器无法正常工作 因此我想提供我的具体案例以获得一些帮助 我也是 Typescript 和 Webpack 的新手 可以提供一些背景信息 项目层次结构 www
  • 如何使用 SASS 扩展/修改(自定义)Bootstrap

    我想创建一个基于 Bootstrap 的网站主题 我想扩展 Bootstrap 的默认组件并更改其中的一些组件 为此 我需要access到 Bootstrap 定义的 SASS 变量 这样我就可以覆盖它们 我想过从 GitHub 克隆 Bo
  • 正则表达式查找具有起始词和结束词的最短字符串

    我想找到一种方法来编写正则表达式来搜索以指定的开始子字符串开头并以另一个指定的结束字符串结尾但总长度最小的字符串的出现次数 例如 如果我的起始字符串是bar我的结束字符串是foo当搜索字符串时barbazbarbazfoobazfoo那么我
  • 解析没有 .proto 文件的 Protocol-Buffers

    作为安全项目的一部分 我正在对 Android 应用程序进行逆向工程 我的第一步是发现应用程序和服务器之间交换的协议 我发现正在使用的协议是协议缓冲区 鉴于 protobuf 的性质 需要原始 proto 文件才能反序列化 protobuf
  • 如何使用 Vue JS 设置嵌套数组的增量计数器

    我使用 Vue JS 的数组深度为两层 我需要一个从 0 开始的索引 并为顶部数组中的每个项目递增 这是我的 HTML div div
  • 使用DDD,如何实现批处理?

    我的逻辑包括从一个系统中选择大量记录 执行多个转换 基于业务规则 并将它们插入到另一个系统中 将这些记录中的每一个实例化为对象 对它们执行转换 然后将所有这些对象插入到另一个系统中 这似乎对性能 和内存 产生了很大的影响 在 DDD 中实现
  • 通过 jQuery ajax 提交表单,包括文件上传

    HTML
  • WP8 - 此软件包使用的应用程序名称尚未为此应用程序保留

    我正在将 Windows Phone 8 应用程序提交到应用程序商店 当我单击Review And Submit我收到错误 This package is using an app name that hasn t been reserve
  • 在 Spacy 中基于现有英语模型实现自定义 POS Tagger:NLP - Python

    我正在尝试使用下面的代码重新训练 spacy 中现有的 POS Tagger 以显示某些错误分类单词的正确标签 但它给了我这个错误 警告 未命名向量 这不允许多个向量模型 待加载 形状 0 0 from spacy vocab import
  • 如何在不生成整数的情况下找到斐波那契数的前 k 位数字?

    我必须找到斐波那契数列 2 10 6 以内的所有斐波那契数的前 k 位数字 显然 我们不能将斐波那契数列的值存储在任何变量中 即使计算所有斐波那契数本身也需要大量的计算时间 那么 有没有办法只得到斐波那契数的前k位而不生成整个数呢 由于您只
  • ajax成功返回0

    我需要一点帮助 我设计了我的自定义ajax 函数 这是一个简单的表单 输入 5 个值进行验证 然后通过 ajax 将数据发送到 php 函数 该函数通过电子邮件发送这些详细信息 成功后 将向用户显示弹出窗口以进行确认 我已经应用了验证 并且
  • 如何在启动时启动 Docker for Mac 守护进程?

    我想让 Docker for Mac 在启动时启动 而不是在登录时启动 我该怎么做呢 我想创建一个LaunchDaemon 我只是不知道要启动什么程序 我看到的所有例子似乎都使用docker machine定义一个虚拟机 但文档现在说doc