{"id":43055,"date":"2023-01-27T21:33:08","date_gmt":"2023-10-15T20:22:43","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/"},"modified":"2024-04-29T11:47:10","modified_gmt":"2024-04-29T03:47:10","slug":"%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/","title":{"rendered":"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u4ee5\u524d\uff0c\u6211\u5728\u5de5\u4f5c\u4e2d\u4f7f\u7528Serverspec\u4f5c\u4e3a\u670d\u52a1\u5668\u5efa\u8bbe\u540e\u7684\u6d4b\u8bd5\u5de5\u5177\u3002<\/p>\n<p>\u6211\u5728\u4e0eAnsible\u7ed3\u5408\u4f7f\u7528\u65f6\uff0c\u8fdb\u884c\u4e86Serverspec\u6d4b\u8bd5\u7528\u4f8b\u7684\u751f\u6210\u548c\u81ea\u52a8\u6267\u884c\uff0c\u4f46\u4e0e\u624b\u52a8\u64cd\u4f5c\u76f8\u6bd4\uff0c\u5c3d\u7ba1\u786e\u5b9e\u66f4\u5feb\uff0c\u4f46\u6267\u884c\u4ecd\u7136\u9700\u8981\u76f8\u5f53\u4e00\u6bb5\u65f6\u95f4\u3002<\/p>\n<blockquote><p>\u4eba\u7c7b\uff0c\u8d8a\u6765\u8d8a\u8d2a\u5a6a\u554a\uff0c\u771f\u662f\u53ef\u6015\u554a\uff0c\u53ef\u6015\u554a\u3002<\/p><\/blockquote>\n<p>\u5728\u67d0\u4e00\u5929\uff0c\u6211\u5f97\u77e5\u4e86\u4e00\u4e2a\u540d\u4e3aGoss\u7684\u6d4b\u8bd5\u5de5\u5177\uff0c\u4e8e\u662f\u6211\u51b3\u5b9a\u8bd5\u8bd5\u770b\u3002<\/p>\n<h1>Goss \u7684\u7279\u70b9\u4e0e Serverspec \u76f8\u6bd4\u8f83<\/h1>\n<div>\n<div class=\"post-table\">\nServerspecGoss\u74b0\u5883\u69cb\u7bc9\u305d\u3053\u305d\u3053\u7c21\u5358\u3001\u30c6\u30b9\u30c8\u5bfe\u8c61\u306b\u63a5\u7d9a\u53ef\u80fd\u306a 1 \u30db\u30b9\u30c8\u306b\u3042\u308c\u3070\u3044\u3044\u30c6\u30b9\u30c8\u5bfe\u8c61\u5168\u3066\u306b\u30b7\u30f3\u30b0\u30eb\u30d0\u30a4\u30ca\u30ea\u914d\u5e03\u5b9f\u884c\u901f\u5ea6*\u901f\u3044 (100\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9:10\u79d2\u304f\u3089\u3044)\u7206\u901f(500\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9:1\u79d2\u304f\u3089\u3044)\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u5f62\u5f0fRuby \u5f62\u5f0fYAML \u5f62\u5f0f\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u751f\u6210\u624b\u52d5\u4e00\u90e8\u81ea\u52d5\u751f\u6210\u53ef\u80fd<\/div>\n<\/div>\n<blockquote><p>\u5173\u4e8e\u6267\u884c\u901f\u5ea6\uff0c\u6211\u8ba4\u4e3a\u6d4b\u8bd5\u7684\u76ee\u6807\u662f\u7269\u7406\u673a\u8fd8\u662f\u865a\u62df\u673a\u7b49\u4f1a\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u4ec5\u4f9b\u53c2\u8003\u3002<\/p><\/blockquote>\n<h1>\u5efa\u7acb\u73af\u5883<\/h1>\n<p>\u5728\u6d4b\u8bd5\u7684\u76ee\u7684\u4e0a\uff0c\u5c06 Serverspec \u76f4\u63a5\u66ff\u6362\u4e3a Goss\uff0c\u5e76\u7ee7\u7eed\u4f7f\u7528 Ansible \u6765\u8fdb\u884c\u6d4b\u8bd5\u7684\u81ea\u52a8\u6267\u884c\u3002<\/p>\n<h2>\u73af\u5883<\/h2>\n<p>\u4f7f\u7528docker-compose\u6765\u542f\u52a8ansible-server\u548ctest-target\u8fd9\u4e24\u4e2a\u5bb9\u5668\uff0c\u5e76\u8fdb\u884c\u6d4b\u8bd5\u3002<\/p>\n<p>\u901a\u8fc7\u5728 ansible \u670d\u52a1\u5668\u4e0a\u5b89\u88c5 Goss \u5e76\u5c06\u5176\u4e8c\u8fdb\u5236\u6587\u4ef6\u5206\u6563\u5230 Ansible \u7684\u6d4b\u8bd5\u76ee\u6807\u4e0a\u8fdb\u884c\u6d4b\u8bd5\u3002<\/p>\n<pre class=\"post-pre\"><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \r\n\u2502 ansible-server \u2502 =[SSH]=&gt; \u2502 test-target \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n<\/code><\/pre>\n<p>\u76ee\u5f55\u7ed3\u6784<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">.<\/span>\r\n\u251c\u2500\u2500 ansible-server\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Dockerfile\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 test-target-key\r\n\u251c\u2500\u2500 docker-compose.yml\r\n\u251c\u2500\u2500 test-target\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Dockerfile\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 test-target-key.pub\r\n\u2514\u2500\u2500 work\r\n    \u251c\u2500\u2500 inventory.yml\r\n    \u251c\u2500\u2500 roles\r\n    \u2502\u00a0\u00a0 \u2514\u2500\u2500 goss\r\n    \u2502\u00a0\u00a0     \u251c\u2500\u2500 files\r\n    \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u251c\u2500\u2500 goss\r\n    \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 goss.yaml\r\n    \u2502\u00a0\u00a0     \u251c\u2500\u2500 tasks\r\n    \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n    \u2502\u00a0\u00a0     \u251c\u2500\u2500 templates\r\n    \u2502\u00a0\u00a0     \u2514\u2500\u2500 vars\r\n    \u2502\u00a0\u00a0         \u2514\u2500\u2500 main.yml\r\n    \u2514\u2500\u2500 site.yml\r\n<\/code><\/pre>\n<p>Dockerfile\u3010ansible-server\u3011<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu:18.04<\/span>\r\n\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/root<\/span>\r\n\r\n<span class=\"c\"># SSH Settings<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/test-target-key \/root\/.ssh\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/config \/root\/.ssh\/<\/span>\r\n<span class=\"c\"># Install common tools<\/span>\r\n<span class=\"k\">RUN <\/span>apt update <span class=\"o\">&amp;&amp;<\/span> apt <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> curl vim\r\n<span class=\"c\"># Install ansible<\/span>\r\n<span class=\"k\">RUN <\/span>apt <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> software-properties-common <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>    apt-add-repository <span class=\"nt\">--yes<\/span> <span class=\"nt\">--update<\/span> ppa:ansible\/ansible <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>    apt <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> ansible\r\n<span class=\"c\"># Install Goss<\/span>\r\n<span class=\"k\">RUN <\/span>curl <span class=\"nt\">-L<\/span> https:\/\/github.com\/aelsabbahy\/goss\/releases\/latest\/download\/goss-linux-amd64 <span class=\"nt\">-o<\/span> \/usr\/local\/bin\/goss <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"nb\">chmod<\/span> +rx \/usr\/local\/bin\/goss <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>    <span class=\"nb\">cp<\/span> <span class=\"nt\">-i<\/span> <span class=\"si\">$(<\/span>which goss<span class=\"si\">)<\/span> .\r\n\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"tail\", \"-f\", \"\/dev\/null\"]<\/span>\r\n<\/code><\/pre>\n<p>Dockerfile\u3010\u6d4b\u8bd5\u76ee\u6807\u3011\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> ubuntu:18.04<\/span>\r\n\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/root<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>apt update <span class=\"o\">&amp;&amp;<\/span> apt <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> openssh-server\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">mkdir<\/span> \/var\/run\/sshd\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">echo<\/span> <span class=\"s1\">'root:P@ssw0rd'<\/span> | chpasswd\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/test-target-key.pub \/root\/.ssh\/authorized_keys<\/span>\r\n<span class=\"k\">EXPOSE<\/span><span class=\"s\"> 22<\/span>\r\n\r\n<span class=\"c\"># For Test.<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">echo<\/span> <span class=\"s2\">\"this is test.\"<\/span> <span class=\"o\">&gt;<\/span> test.txt\r\n<span class=\"k\">RUN <\/span>apt <span class=\"nb\">install<\/span> <span class=\"nt\">--yes<\/span> nginx\r\n<span class=\"k\">EXPOSE<\/span><span class=\"s\"> 80<\/span>\r\n\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"\/usr\/sbin\/sshd\", \"-D\"]<\/span>\r\n<\/code><\/pre>\n<p>docker-compose.yml \u53ef\u4ee5\u7528\u4ee5\u4e0b\u4e2d\u6587\u7ffb\u8bd1: \u6570\u64cd\u96c6\u5361\u9a91-\u8bd5\u8bd5.yml<\/p>\n<pre class=\"post-pre\"><code><span class=\"nn\">---<\/span>\r\n  <span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">2\"<\/span>\r\n  <span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">ansible-server<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/ansible-server<\/span>\r\n      <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">.\/work:\/root\/work<\/span>\r\n\r\n    <span class=\"na\">test-target<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/test-target<\/span>\r\n      <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">8080:80<\/span>\r\n<\/code><\/pre>\n<h2>\u5f00\u59cb<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>docker-compose build\r\n<span class=\"nv\">$ <\/span>docker-compose up <span class=\"nt\">-d<\/span>\r\n<\/code><\/pre>\n<h1>\u8003\u8bd5 sh\u00ec)<\/h1>\n<p>\u5728 test-target \u7684 Dockerfile \u4e2d\u7684\u63cf\u8ff0\u4e2d\uff0c\u8fdb\u884c\u4ee5\u4e0b\u6d4b\u8bd5\u3002<\/p>\n<p>test.txt \u306b this is test. \u3068\u8a18\u8ff0\u3055\u308c\u3066\u3044\u308b\u3053\u3068<br \/>\nNginx \u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068<br \/>\nNginx \u304c\u8d77\u52d5\u3057\u3066\u3044\u308b\u3053\u3068<br \/>\n80 \u30dd\u30fc\u30c8\u3067 Listen \u3057\u3066\u3044\u308b\u3053\u3068<\/p>\n<p>\u6d4b\u8bd5\u7528\u4f8b\u53ef\u4ee5\u4f7f\u7528YAML\u683c\u5f0f\u8fdb\u884c\u63cf\u8ff0\u3002<\/p>\n<p>goss.yaml \u6587\u4ef6<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">file<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"s\">\/root\/test.txt<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">exists<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"na\">contains<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">this<\/span> <span class=\"s\">is<\/span> <span class=\"s\">test.\"<\/span><span class=\"pi\">]<\/span>\r\n\r\n<span class=\"na\">port<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"s\">tcp:80:<\/span>\r\n    <span class=\"s\">listening<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"s\">ip<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">0.0.0.0<\/span>\r\n  <span class=\"s\">tcp6:80:<\/span>\r\n    <span class=\"s\">listening<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"s\">ip<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s1\">'<\/span><span class=\"s\">::'<\/span>\r\n<span class=\"na\">service<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">nginx<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"na\">running<\/span><span class=\"pi\">:<\/span> <span class=\"no\">false<\/span>\r\n<span class=\"na\">process<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">nginx<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">running<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n<\/code><\/pre>\n<p>\u7701\u7565 Ansible \u7684 Playbook<\/p>\n<h2>\u8fdb\u884c\u6d4b\u8bd5<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>docker-compose <span class=\"nb\">exec <\/span>ansible-server \/bin\/bash\r\nroot@38b380ec3969:~# <span class=\"nb\">cd <\/span>work\/\r\nroot@38b380ec3969:~\/work# ansible-playbook <span class=\"nt\">-i<\/span> inventory.yml site.yml\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>ok: <span class=\"o\">[<\/span>test-target] <span class=\"o\">=&gt;<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"s2\">\"msg\"<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s2\">\"changed\"<\/span>: <span class=\"nb\">true<\/span>,\r\n        <span class=\"s2\">\"cmd\"<\/span>: <span class=\"o\">[<\/span>\r\n            <span class=\"s2\">\".\/goss\"<\/span>,\r\n            <span class=\"s2\">\"validate\"<\/span>,\r\n            <span class=\"s2\">\"--format\"<\/span>,\r\n            <span class=\"s2\">\"documentation\"<\/span>\r\n<span class=\"nt\">---<\/span>\r\n        <span class=\"s2\">\"stdout_lines\"<\/span>: <span class=\"o\">[<\/span>\r\n            <span class=\"s2\">\"File: \/root\/test.txt: exists: matches expectation: [true]\"<\/span>,\r\n            <span class=\"s2\">\"File: \/root\/test.txt: contains: matches expectation: [this is test.]\"<\/span>,\r\n            <span class=\"s2\">\"Port: tcp:80: listening: matches expectation: [true]\"<\/span>,\r\n            <span class=\"s2\">\"Port: tcp:80: ip: matches expectation: [[<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">0.0.0.0<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">]]\"<\/span>,\r\n            <span class=\"s2\">\"Port: tcp6:80: listening: matches expectation: [true]\"<\/span>,\r\n            <span class=\"s2\">\"Port: tcp6:80: ip: matches expectation: [[<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">::<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">]]\"<\/span>,\r\n            <span class=\"s2\">\"Process: nginx: running: matches expectation: [true]\"<\/span>,\r\n            <span class=\"s2\">\"Service: nginx: enabled: matches expectation: [true]\"<\/span>,\r\n            <span class=\"s2\">\"Service: nginx: running: matches expectation: [false]\"<\/span>,\r\n            <span class=\"s2\">\"\"<\/span>,\r\n            <span class=\"s2\">\"\"<\/span>,\r\n            <span class=\"s2\">\"Total Duration: 0.006s\"<\/span>,\r\n            <span class=\"s2\">\"Count: 9, Failed: 0, Skipped: 0\"<\/span>\r\n        <span class=\"o\">]<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u54c7\uff0c\u901f\u5ea6\u771f\u662f\u7206\u8868\u554a\uff0c\u53ea\u7528\u4e860.006\u79d2\u5c31\u901a\u8fc7\u4e869\u4e2a\u6d4b\u8bd5\u7528\u4f8b\u3002<\/p>\n<h1>\u603b\u7ed3<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Goss \u306f\u3084\u306f\u308a\u7206\u901f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Ansible \u3068\u306e\u76f8\u6027\u3082\u826f\u3055\u305d\u3046<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u4f5c\u308b\u306e\u3082\u7c21\u5358 (\u7d39\u4ecb\u3057\u3066\u306a\u3044\u304c\u3001\u4eca\u56de\u306e\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9\u306f\u307b\u3068\u3093\u3069\u81ea\u52d5\u751f\u6210\u3057\u305f)<\/ul>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u8fd8\u6709\u4e00\u4e9b\u529f\u80fd\uff0c\u5982\u6839\u636e\u73af\u5883\u5207\u6362\u6d4b\u8bd5\u7528\u4f8b\u548c\u4f7f\u7528for\u5faa\u73af\u8fd0\u884c\u6d4b\u8bd5\u7b49\u3002<\/p>\n<h1>\u6700\u540e<\/h1>\n<p>\u6211\u5011\u5c07\u6b64\u6b21\u5275\u5efa\u7684\u539f\u59cb\u78bc\u5728 GitHub \u4e0a\u516c\u958b\u3002<\/p>\n<p>\u5982\u679c\u60f3\u8981\u5236\u4f5c\u590d\u6742\u7684\u6d4b\u8bd5\uff0c\u4f3c\u4e4e\u8fd8\u662f\u9700\u8981\u638c\u63e1Golang\u7684\u77e5\u8bc6\u3002\u6bd5\u7adf\u73b0\u5728\u662fGolang\u7684\u65f6\u4ee3\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u4ee5\u524d\uff0c\u6211\u5728\u5de5\u4f5c\u4e2d\u4f7f\u7528Serverspec\u4f5c\u4e3a\u670d\u52a1\u5668\u5efa\u8bbe\u540e\u7684\u6d4b\u8bd5\u5de5\u5177\u3002 \u6211\u5728\u4e0eAnsible\u7ed3\u5408\u4f7f\u7528\u65f6\uff0c\u8fdb [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-43055","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86goss\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u4ee5\u524d\uff0c\u6211\u5728\u5de5\u4f5c\u4e2d\u4f7f\u7528Serverspec\u4f5c\u4e3a\u670d\u52a1\u5668\u5efa\u8bbe\u540e\u7684\u6d4b\u8bd5\u5de5\u5177\u3002 \u6211\u5728\u4e0eAnsible\u7ed3\u5408\u4f7f\u7528\u65f6\uff0c\u8fdb [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86goss\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-15T20:22:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T03:47:10+00:00\" \/>\n<meta name=\"author\" content=\"\u97f5, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u97f5, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/\",\"name\":\"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-10-15T20:22:43+00:00\",\"dateModified\":\"2024-04-29T03:47:10+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e\",\"name\":\"\u97f5, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g\",\"caption\":\"\u97f5, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86goss\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss","og_description":"\u9996\u5148 \u4ee5\u524d\uff0c\u6211\u5728\u5de5\u4f5c\u4e2d\u4f7f\u7528Serverspec\u4f5c\u4e3a\u670d\u52a1\u5668\u5efa\u8bbe\u540e\u7684\u6d4b\u8bd5\u5de5\u5177\u3002 \u6211\u5728\u4e0eAnsible\u7ed3\u5408\u4f7f\u7528\u65f6\uff0c\u8fdb [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86goss\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-10-15T20:22:43+00:00","article_modified_time":"2024-04-29T03:47:10+00:00","author":"\u97f5, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u97f5, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"2 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/","name":"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-10-15T20:22:43+00:00","dateModified":"2024-04-29T03:47:10+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u6211\u5728docker-compose\u4e2d\u5c1d\u8bd5\u4e86Goss"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/6530331a63adef3b3443a1fab53a0e6e","name":"\u97f5, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429ccb39b3fff5188bc17986222cfb0936cbadb8cc933cff04ab5ca01bd30a08?s=96&d=mm&r=g","caption":"\u97f5, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunke\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e6%88%91%e5%9c%a8docker-compose%e4%b8%ad%e5%b0%9d%e8%af%95%e4%ba%86goss%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=43055"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43055\/revisions"}],"predecessor-version":[{"id":85089,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43055\/revisions\/85089"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=43055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=43055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=43055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}