当前位置: 首页 > 软件库 > 云计算 > >

dockerize

授权协议 MIT License
开发语言 Google Go
所属分类 云计算
软件类型 开源软件
地区 不详
投 递 者 姜乐家
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

dockerize

Utility to simplify running applications in docker containers.

dockerize is a utility to simplify running applications in docker containers. It allows you to:

  • generate application configuration files at container startup time from templates and container environment variables
  • Tail multiple log files to stdout and/or stderr
  • Wait for other services to be available using TCP, HTTP(S), unix before starting the main process.

The typical use case for dockerize is when you have an application that has one or more configuration files and you would like to control some of the values using environment variables.

For example, a Python application using Sqlalchemy might not be able to use environment variables directly.It may require that the database URL be read from a python settings file with a variable namedSQLALCHEMY_DATABASE_URI. dockerize allows you to set an environment variable such asDATABASE_URL and update the python file when the container starts.In addition, it can also delay the starting of the python application until the database container is running and listening on the TCP port.

Another use case is when the application logs to specific files on the filesystem and not stdoutor stderr. This makes it difficult to troubleshoot the container using the docker logs command.For example, nginx will log to /var/log/nginx/access.log and/var/log/nginx/error.log by default. While you can sometimes work around this, it's tedious to find a solution for every application. dockerize allows you to specify which logs files should be tailed and where they should be sent.

See A Simple Way To Dockerize Applications

Installation

Download the latest version in your container:

Docker Base Image

The jwilder/dockerize image is a base image based on alpine linux. dockerize is installed in the $PATH and can be used directly.

FROM jwilder/dockerize
...
ENTRYPOINT dockerize ...

Ubuntu Images

RUN apt-get update && apt-get install -y wget

ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

For Alpine Images:

RUN apk add --no-cache openssl

ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz

Usage

dockerize works by wrapping the call to your application using the ENTRYPOINT or CMD directives.

This would generate /etc/nginx/nginx.conf from the template located at /etc/nginx/nginx.tmpl andsend /var/log/nginx/access.log to STDOUT and /var/log/nginx/error.log to STDERR after runningnginx, only after waiting for the web host to respond on tcp 8000:

CMD dockerize -template /etc/nginx/nginx.tmpl:/etc/nginx/nginx.conf -stdout /var/log/nginx/access.log -stderr /var/log/nginx/error.log -wait tcp://web:8000 nginx

Command-line Options

You can specify multiple templates by passing using -template multiple times:

$ dockerize -template template1.tmpl:file1.cfg -template template2.tmpl:file3

Templates can be generated to STDOUT by not specifying a dest:

$ dockerize -template template1.tmpl

Template may also be a directory. In this case all files within this directory are processed as template and stored with the same name in the destination directory.If the destination directory is omitted, the output is sent to STDOUT. The files in the source directory are processed in sorted order (as returned by ioutil.ReadDir).

$ dockerize -template src_dir:dest_dir

If the destination file already exists, dockerize will overwrite it. The -no-overwrite flag overrides this behaviour.

$ dockerize -no-overwrite -template template1.tmpl:file

You can tail multiple files to STDOUT and STDERR by passing the options multiple times.

$ dockerize -stdout info.log -stdout perf.log

If inotify does not work in you container, you use -poll to poll for file changes instead.

$ dockerize -stdout info.log -stdout perf.log -poll

If your file uses {{ and }} as part of it's syntax, you can change the template escape characters using the -delims.

$ dockerize -delims "<%:%>"

Http headers can be specified for http/https protocols.

$ dockerize -wait http://web:80 -wait-http-header "Authorization:Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

Waiting for other dependencies

It is common when using tools like Docker Compose to depend on services in other linked containers, however oftentimes relying on links is not enough - whilst the container itself may have started, the service(s) within it may not yet be ready - resulting in shell script hacks to work around race conditions.

Dockerize gives you the ability to wait for services on a specified protocol (file, tcp, tcp4, tcp6, http, https and unix) before starting your application:

$ dockerize -wait tcp://db:5432 -wait http://web:80 -wait file:///tmp/generated-file

Timeout

You can optionally specify how long to wait for the services to become available by using the -timeout # argument (Default: 10 seconds). If the timeout is reached and the service is still not available, the process exits with status code 1.

$ dockerize -wait tcp://db:5432 -wait http://web:80 -timeout 10s

See this issue for a deeper discussion, and why support isn't and won't be available in the Docker ecosystem itself.

Using Templates

Templates use Golang text/template. You can access environmentvariables within a template with .Env.

{{ .Env.PATH }} is my path

There are a few built in functions as well:

  • default $var $default - Returns a default value for one that does not exist. {{ default .Env.VERSION "0.1.2" }}
  • contains $map $key - Returns true if a string is within another string
  • exists $path - Determines if a file path exists or not. {{ exists "/etc/default/myapp" }}
  • split $string $sep - Splits a string into an array using a separator string. Alias for strings.Split. {{ split .Env.PATH ":" }}
  • replace $string $old $new $count - Replaces all occurrences of a string within another string. Alias for strings.Replace. {{ replace .Env.PATH ":" }}
  • parseUrl $url - Parses a URL into it's protocol, scheme, host, etc. parts. Alias for url.Parse
  • atoi $value - Parses a string $value into an int. {{ if (gt (atoi .Env.NUM_THREADS) 1) }}
  • add $arg1 $arg - Performs integer addition. {{ add (atoi .Env.SHARD_NUM) -1 }}
  • isTrue $value - Parses a string $value to a boolean value. {{ if isTrue .Env.ENABLED }}
  • lower $value - Lowercase a string.
  • upper $value - Uppercase a string.
  • jsonQuery $json $query - Returns the result of a selection query against a json document.
  • loop - Create for loops.

jsonQuery

Objects and fields are accessed by name. Array elements are accessed by index in square brackets (e.g. [1]). Nested elements are separated by dots (.).

Examples:

With the following JSON in .Env.SERVICES

{
  "services": [
    {
      "name": "service1",
      "port": 8000,
    },{
      "name": "service2",
      "port": 9000,
    }
  ]
}

the template expression jsonQuery .Env.SERVICES "services.[1].port" returns 9000.

loop

loop allows for creating for loop within a template. It takes 1 to 3 arguments.

# Loop from 0...10
{{ range loop 10 }}
i = {{ . }}
{{ end }}

# Loop from 5...10
{{ range $i := loop 5 10 }}
i = {{ $i }}
{{ end }}

# Loop from 5...10 by 2
{{ range $i := loop 5 10 2 }}
i = {{ $i }}
{{ end }}

License

MIT

  • Dockerizing 一个应用是转化一个应用运行在 Docker 容器中的过程。虽然 dockering 大部分应用是简单的,但是这里每次都有一些问题围绕着工作。每次工作的时候有几个问题都需要待解决。 在 dockerization 时两个常见的问题是: 当它依赖于配置文件时,使得应用使用环境变量 发送应用日志到 STDOUT/STDERR,当它默认记录在 Docker 的文件系统 这篇文章介绍

  • 有没有过项目之间各种Java版本开发环境切换的场景;有没有过github上clone回来的代码库,由于各种开发环境依赖无法运行的问题;有没有过进入一个新项目时各种配开发环境到深夜的经历...Come On!为什么会这样,一切都是开发环境问题。为了不让别人痛苦,更不想让自己痛苦,请容器化开发环境吧,让我们享受一键部署开发环境的痛快吧。 用什么容器化呢?当然是Docker啦,轻量级又好用,又流行,最关

 相关资料
  • 问题内容: 我正在尝试在dockerizedselenium独立firefox浏览器上运行Ruby on Rails功能测试。似乎我在联网方面遇到问题,因为selenium实例无法连接到Capybara启动的URL。 这是我的示例文件: 我在启用网络的情况下开始docker-compose: 测试脚本像这样运行一个rspec命令 对于docker测试,我为Capybara启用了远程驱动程序: 最后

  • 问题内容: 我为Hadoop(2.7.1)名称节点和数据节点分别设置了Docker(1.9.1)映像。我可以从这些容器中创建容器,并使它们通过用户定义的Docker网络进行通信。但是,datanode似乎报告自己具有网络网关的IP地址,而不是其自己的IP地址。虽然这不会对单个数据节点造成任何问题,但是在添加其他数据节点时,仍然会引起混乱。它们都使用相同的IP地址注册,并且名称节点在它们之间翻转,仅

  • 我已经在端口8180上使用以下命令启动了dockerze密钥斗篷: 作为管理员,我创建了两个领域(在同一个keyclock实例中): 租户1 银 在Tenant1中,我定义了一个连接到Angular应用程序(它可以工作)和GITHUB身份提供者(它也可以工作)的客户端(public) 在Silver Realm中,我将客户端“silverBroker”定义为机密...连接到 Angular 应用程

  • 以下是问题的完整流程 1)Azure构建管道使用以下创建人工制品(docker图像) 2)并将docker图像推入Azure容器注册表()。

  • 我的微服务运行良好。在开发过程中,它在尤里卡命名服务器中被正确注册。当我将我的服务和eureka-server部署到两个不同的容器中时,我的微服务没有在eureka-server中注册。我所有的配置和属性文件如下- 我的客户帐户mysql正在尝试连接http://localhost:8761/eureka/.我清楚地提到了客户帐户mysql属性文件中的默认区域。那就是eureka.client.s

  • 问题内容: 我可以理解对Docker进行无状态服务(例如Web服务器,应用服务器,负载平衡器等)背后的好处。如果您在机器集群上运行这些服务,则很容易以低开销移动这些容器。我不明白容器化数据库的目的是什么?数据库连接到持久存储在特定硬盘中的数据卷。由于状态的原因,实际移动数据库容器并不容易,效率也不高。那么,谁能看到为什么对数据库进行dockerdocker完全有用? 问题答案: “那么,有谁能看到

  • 我想从Dockerfile创建一个具有初始数据库及其表的MySQL容器。 我还有一个特定的etc/mysql/mysql。conf.d/mysqld。cnf文件(我可以在Dockerfile中简单地使用添加指令。) 我希望Dockerfile创建一个MySQL映像,其中包含一个名为DBNAME的数据库,并包含以下表格: 我已经在这里寻找解决问题的方法,但没有找到解决方法。

  • 问题内容: 我的docker compose文件包含三个容器:web,nginx和postgres。Postgres看起来像这样: 我的目标是安装一个与postgres容器内称为的本地文件夹相对应的卷。当我启动这些容器并将数据插入到postgres中时,我验证了所添加数据的全部内容(在postgres容器中),但是在我的本地系统中,只在其中获得了一个文件夹,即已创建,但它为空。为什么? 笔记: 这