首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建一个简单的docker容器来定期发送curl请求?

如何创建一个简单的docker容器来定期发送curl请求?
EN

Stack Overflow用户
提问于 2021-08-11 08:19:20
回答 2查看 65关注 0票数 2

我有以下独立的docker-compose.yml文件:

代码语言:javascript
复制
version: "3"

services:
  feed_activator:
    container_name: feed_activator
    image: docker
    volumes: [ "/var/run/docker.sock:/var/run/docker.sock" ]
    command: [ "/bin/sh", "-c", "apk --no-cache add curl", "while true; do sleep 60; curl 'https://google.com'; done" ]
    restart: "always"

我期望它所做的就是简单地安装curl并每分钟向https://google.com发送一个GET请求。

取而代之的是

代码语言:javascript
复制
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/4) Installing brotli-libs (1.0.9-r3)
(2/4) Installing nghttp2-libs (1.42.0-r1)
(3/4) Installing libcurl (7.78.0-r0)
(4/4) Installing curl (7.78.0-r0)
Executing busybox-1.32.1-r6.trigger
OK: 13 MiB in 24 packages
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
OK: 13 MiB in 24 packages
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
OK: 13 MiB in 24 packages

其中

代码语言:javascript
复制
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
OK: 13 MiB in 24 packages

部分在无休止地重复,容器处于重新启动状态。我必须做些什么才能让它正常工作?任何提示都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-11 10:39:51

我不会尝试像这样写一个“独立的”合成文件。每次重新启动该进程时,它都需要重新安装阿尔卑斯包依赖项;这既慢又浪费,而且只能扩展到微不足道的示例。这种编写复杂command:的设置也很棘手。

我要做的第一件事是编写一个普通的shell脚本,它可以做你想做的事情:

代码语言:javascript
复制
#!/bin/sh
# curl-periodically.sh
while true
do
  sleep 60
  curl 'https://google.com'
done

您可以在Docker之外的本地运行它,以确保它能执行您想要的操作。

代码语言:javascript
复制
chmod +x curl-periodically.sh
./curl-periodicially.sh

然后,您可以编写Dockerfile来将您的程序转换为可运行的Docker映像。这个文件应该被准确地命名为Dockerfile

代码语言:javascript
复制
FROM alpine

# Set up OS-level dependencies
RUN apk --no-cache add curl

# Copy the application in
WORKDIR /app
COPY curl-periodically.sh .

# Explain what to do when a container starts
CMD ["./curl-periodically.sh"]

现在,您的Compose设置只需要解释需要构建此映像。您不需要编写复杂的sh -c命令或绑定挂载任何内容。

代码语言:javascript
复制
version: '3.8'
services:
  feed_activator:
    build: .
    restart: always

(避免绑定-将Docker套接字挂载到容器中,使用Docker Hub docker镜像,或者尝试从其他容器操作容器:您可以通过这种方式简单地将整个主机作为根,这会使您的应用程序不必要地绑定到Docker。一些依赖于docker命令的东西甚至不能在其他容器系统中运行,比如Kubernetes。这个示例似乎根本不需要它,我也没有把它包括在内。)

票数 3
EN

Stack Overflow用户

发布于 2021-08-11 08:46:56

解决方案是在一个命令中运行所有命令,如下所示

代码语言:javascript
复制
command: [ "/bin/sh", "-c", "apk --no-cache add curl; while true; do sleep 60; curl 'https://google.com'; done" ]

请注意...url", "while......url; while...的区别

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68738391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档