【问题标题】:Run a bash script in docker-compose在 docker-compose 中运行 bash 脚本
【发布时间】:2020-10-07 21:14:48
【问题描述】:

我正在尝试通过 docker compose 在我的 docker 服务器上启动一个 OwnCloud 容器。我正在使用来自 Docker Hub 的股票 OwnCloud 图像。这是我的 yaml 文件:

version: '3.1'

services:

  owncloud:
    image: owncloud
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - '/etc/docker/owncloud/data:/var/www/html'
      - '/etc/docker/owncloud/ssl.sh:/etc/apache2/ssl.sh'
    networks:
        default:
            ipv4_address: 192.168.226.28
  mysql:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ********
volumes:
    owncloud_data:
        driver: local
networks:
    default:
        external:
            name: pub_net

效果很好。容器出现了,我可以通过 http 访问它。现在我当然想通过 https 访问,这样你就可以看到我发送到我的容器中的 bash 脚本。以下是该脚本的内容:

#!/bin/bash
a2enmod ssl
a2ensite default-ssl
openssl req -x509 -nodes -days 99999 -newkey rsa:2048 -subj "/C=US/ST=Ohio/L=Cleveland/O=Data/CN=fake.domain.com" -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem
service apache2 restart

现在,如果我手动 bash 进入容器并运行该脚本,效果会很好。我可以通过 https 访问 OwnCloud。这就是令人讨厌的地方。我想自动化运行该脚本的过程,以便在容器更新其重建过程的一部分时。到目前为止,我已经尝试在 yaml 文件中添加一个“命令”字符串,如下所示:

version: '3.1'

services:

  owncloud:
    image: owncloud
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - '/etc/docker/owncloud/data:/var/www/html'
      - '/etc/docker/owncloud/ssl.sh:/etc/apache2/ssl.sh'
    networks:
        default:
            ipv4_address: 192.168.226.28
    command: /etc/apache2/ssl.sh
  mysql:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ********
volumes:
    owncloud_data:
        driver: local
networks:
    default:
        external:
            name: pub_net

当我运行 docker-compose up 时,它似乎确实在运行脚本,除了它一遍又一遍地运行它,并且 apache 服务不断重新启动。这是日志的 sn-p:

重新启动 Apache httpd 网络服务器:apache2。

考虑 ssl 的依赖 setenvif:

模块 setenvif 已启用

考虑 ssl 的依赖 mime:

模块 mime 已启用

考虑ssl的依赖socache_shmcb:

模块 socache_shmcb 已启用

dule ssl 已启用

站点默认-ssl 已启用

生成 RSA 私钥

................+++++

................+++++

将新的私钥写入“/etc/ssl/private/ssl-cert-snakeoil.key”


AH00558:apache2:无法可靠地确定服务器的完全限定域名,使用 192.168.226.28。全局设置“ServerName”指令以禁止显示此消息

[Wed Oct 07 21:09:05.504798 2020] [ssl:warn] [pid 33] AH01906: 192.168.226.28:443:0 服务器证书是 CA 证书(BasicConstraints: CA == TRUE !?)

[Wed Oct 07 21:09:05.504883 2020] [ssl:warn] [pid 33] AH01909: 192.168.226.28:443:0 服务器证书不包含与服务器名称匹配的 ID

重新启动 Apache httpd 网络服务器:apache2。

考虑 ssl 的依赖 setenvif:

模块 setenvif 已启用

考虑 ssl 的依赖 mime:

模块 mime 已启用

考虑ssl的依赖socache_shmcb:

模块 socache_shmcb 已启用

dule ssl 已启用

站点默认-ssl 已启用

生成 RSA 私钥

.......................+++++

.......................+++++

将新的私钥写入“/etc/ssl/private/ssl-cert-snakeoil.key”


AH00558:apache2:无法可靠地确定服务器的完全限定域名,使用 192.168.226.28。全局设置“ServerName”指令以禁止显示此消息

[Wed Oct 07 21:09:15.145928 2020] [ssl:warn] [pid 33] AH01906: 192.168.226.28:443:0 服务器证书是 CA 证书(BasicConstraints: CA == TRUE !?)

[Wed Oct 07 21:09:15.146014 2020] [ssl:warn] [pid 33] AH01909: 192.168.226.28:443:0 服务器证书不包含与服务器名称匹配的 ID

重新启动 Apache httpd 网络服务器:apache2。

考虑 ssl 的依赖 setenvif:

模块 setenvif 已启用

考虑 ssl 的依赖 mime:

模块 mime 已启用

考虑ssl的依赖socache_shmcb:

模块 socache_shmcb 已启用

dule ssl 已启用

站点默认-ssl 已启用

生成 RSA 私钥

.......................+++++

..................................+++++

将新的私钥写入“/etc/ssl/private/ssl-cert-snakeoil.key”


AH00558:apache2:无法可靠地确定服务器的完全限定域名,使用 192.168.226.28。全局设置“ServerName”指令以禁止显示此消息

[Wed Oct 07 21:09:29.712422 2020] [ssl:warn] [pid 33] AH01906: 192.168.226.28:443:0 服务器证书是 CA 证书(BasicConstraints: CA == TRUE !?)

[Wed Oct 07 21:09:29.712500 2020] [ssl:warn] [pid 33] AH01909: 192.168.226.28:443:0 服务器证书不包含与服务器名称匹配的 ID

我不知道从这里去哪里。有什么想法吗?

【问题讨论】:

  • 改用入口点脚本。搜索 entrypoint.sh docker 找到大量示例。
  • 感谢您的回复。我实际上也尝试了这门课程并得到了相同的结果。它只是一遍又一遍地循环入口点脚本。下面 Vith 的答案如我所愿。我相信他的解决方案在将其作为入口点脚本实现时也可以工作。

标签: apache docker ssl https docker-compose


【解决方案1】:

Docker 容器命令应该按照您期望容器运行的时间运行。

当您的脚本启动时,容器中完全没有其他内容在运行。没有 apache2 或任何东西,只有你的脚本。它以service apache2 restart 结尾并立即退出。它不关心您刚刚启动的任何后台进程。它只关心您的前台进程(您的 bash 脚本)是否已经完成。

正如您在图片中看到的(在撰写本文时使用最新版本):https://hub.docker.com/layers/owncloud/library/owncloud/latest/images/sha256-57e690e039c947e4de6bdae767b57b402d3ed9b9ed9f12ba5d31d3cf92def4b8?context=explore 它正在使用CMD ["apache2-foreground"] 运行。这就是你应该如何结束你的 bash 脚本,以便它也在前台运行 apache2:

#!/bin/bash
a2enmod ssl
a2ensite default-ssl
openssl req -x509 -nodes -days 99999 -newkey rsa:2048 -subj "/C=US/ST=Ohio/L=Cleveland/O=Data/CN=fake.domain.com" -keyout /etc/ssl/private/ssl-cert-snakeoil.key -out /etc/ssl/certs/ssl-cert-snakeoil.pem
apache2-foreground

【讨论】:

  • 我在我的 bash 脚本末尾添加了 apache2-foreground 命令,瞧!它完全按照我的意图工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多