Giter Site home page Giter Site logo

apisix-build-tools's People

Contributors

alinsran avatar an-dj avatar bzp2010 avatar enableasync avatar fesily avatar fuchange avatar idbeta avatar imjoey avatar leslie-tsang avatar lingsamuel avatar membphis avatar michael754267513 avatar monkeydluffy6017 avatar moonming avatar nic-chen avatar qsliu2017 avatar revolyssup avatar saintak avatar sheharyaar avatar shreemaan-abhishek avatar sn0rt avatar soulbird avatar spacewander avatar starsz avatar sunnycjd avatar tzssangglass avatar xunzhuo avatar yiyiyimu avatar zaunist avatar zll600 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

apisix-build-tools's Issues

feat: Support use apisix-openresty as dependency

For now, the apisix rpm will always use openresty as a dependency. Actually users may use the enhanced one apisix-openresty to serve apisix. So this build-tool should support users to choose which openresty version to use.

feat : add "geoip2" support

Understanding the GeoIP data for an incoming request is a common use case for many API GWs. I think Apisix should support natively adding the "GeoIP2 NGINX module". Currently, the only way to do that is to build it ourselves.

For reference, have a look at this issue: apache/apisix#3946 (comment)

Also, GeoIP( not Geoip2) NGINX module only works with the legacy database format and MaxMind seems to stop the legacy format from being publicly available in 2019 as it will be officially unsupported in around a year. We should probably go with " the geoip2 module " instead, and it's officially supported by Nginx as we can find the geoip2 module in Nginx doc, so it is definitely supported that's why I didn't see a reason we shouldn't do it then. I think GeoIP2 support would be a good feature for Apisix.

discuss: does the packaging method should be updated?

I have learned some well-known open-source projects and found that their packaging methods have similarities. I wonder if the packaging methods of apisix should learned from them?

tyk kong traefik skywalking envoy tidb
Project language golang lua golang java c++ golang
Packaging env dockerfile dockerfile dockerfile docker
Packaging method shell makefile makefile mvnw shell makefile

In these projects, the technology stacks of Kong and apisix are the same, and I think in these projects, Kong’s method is better: deploy the packaging environment via docker, so that the environment is clean and unified every time; packaging via makefile , so that the packaging entry is the same, passing different parameters can make different packages.
What do you think?

failed to load plugin [ldap-auth] err: error loading module 'lualdap' from file '/usr/local/apisix/deps/lib/lua/5.1/lualdap.so':"failed to load plugin [ldap-auth]

Problem

When trying to test the existing plugin with apisix RPM package, it fails with loading module failure.
(Just to clarify packaged version of apisix works well with it)

Steps to reproduce

  1. Install apisix, apisix-base in RHEL compatible distribution
$ rpm -q apisix
apisix-2.14.1-0.el8.x86_64
$ rpm -q apisix-base
apisix-base-1.21.4.1.0-0.el8.x86_64
  1. Install perl-Test-Nginx from powertools repository
$ rpm -q perl-Test-Nginx
perl-Test-Nginx-0.29-2.el8.noarch
  1. clone apisix repository
  2. Modify t/APISIX.pm to allow additional lua_package_path lua_package_cpath to refer apisix RPM's bundled modules
  3. run prove to test plugin/example.t
TEST_NGINX_BINARY=/usr/bin/openresty prove -I. -I./t -r t/plugin/example.t
...
Test Summary Report
-------------------
t/plugin/example.t (Wstat: 0 Tests: 91 Failed: 30)
  Failed tests:  3-4, 10-11, 17-18, 24-25, 31-32, 42-49
                52-53, 59-60, 66-67, 73-74, 80-81, 87-88
  Parse errors: No plan found in TAP output
Files=1, Tests=91,  4 wallclock secs ( 0.02 usr  0.01 sys +  0.57 cusr  0.18 csys =  0.78 CPU)                                             
Result: FAIL

Expected

TEST_NGINX_BINARY=/usr/bin/openresty prove -I. -I./t -r t/plugin/example.t succeeds.

Additional Information

t/servroot/logs/error.log indicates a loading error like this:

2022/07/01 14:30:40 [error] 81507#81507: *2 [lua] plugin.lua:110: load_plugin(): failed to load plugin [ldap-auth] err: error loading module
 'lualdap' from file '/usr/local/apisix/deps/lib/lua/5.1/lualdap.so':
        /usr/lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b, context: init_worker_by_lua*
2022/07/01 14:30:40 [error] 81506#81506: *1 [lua] plugin.lua:110: load_plugin(): failed to load plugin [ldap-auth] err: error loading module
 'lualdap' from file '/usr/local/apisix/deps/lib/lua/5.1/lualdap.so':
        /usr/lib64/libk5crypto.so.3: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b, context: init_worker_by_lua*

Then, disabled ldap-auth from conf/config-default.yaml plugins: section, it succeeds, so it can be a temporary workaround to test it.

NOTE: I expected that /usr/lib64/* is used, but it seems that it is not true in this case (undefined symbol).

$ ldd /usr/local/apisix/deps/lib/lua/5.1/lualdap.so  |grep crypto
        libcrypto.so.1.1 => /usr/lib64/libcrypto.so.1.1 (0x00007fdbf489e000)
        libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007fdbf3d1b000)
$ objdump -TC /usr/lib64/libcrypt.so.1.1.0 |grep EVP_KDF_
$ objdump -TC /usr/lib64/libk5crypto.so.3 | grep EVP_KDF_
0000000000000000      DF *UND*  0000000000000000  OPENSSL_1_1_1b EVP_KDF_ctrl
0000000000000000      DF *UND*  0000000000000000  OPENSSL_1_1_1b EVP_KDF_CTX_new_id
0000000000000000      DF *UND*  0000000000000000  OPENSSL_1_1_1b EVP_KDF_CTX_free
0000000000000000      DF *UND*  0000000000000000  OPENSSL_1_1_1b EVP_KDF_derive
$ objdump -TC /usr/local/openresty/openssl111/lib/libcrypto.so.1.1 | grep EVP_KDF

It seems that there is a mismatch between build time dependency and runtime dependency or something else.

The RPM package is not noarch

I note that apisix-2.1 provided a noarch rpm package,

But it contains some binaries files built on X86_64 and caused the apifix command cant find the file at ARM system.

Like apache/apisix#issue-691844591.

# file ./local/apisix/deps/lib/lua/5.1/lfs.so
./local/apisix/deps/lib/lua/5.1/lfs.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5de2ad9d73ddbdaa91151ddfee3eef545a010902, not stripped

Would you like to add some options to fpm in run.sh to buind different arch packages?
Or I can provided an spec file to build packages by rpmbuild command ?

bug: the generated rpm package cannot be started due to incorrect shebang

通过此项目构建的 apisix rpm 包可执行文件不可用

构建命令:

make package type=rpm app=apisix version=2.10 checkout=2.10 local_code_path=./apisix-2.10.0

得到的安装包安装后,提示:

apisix help
/usr/local/openresty/luajit/bin/luajit: /usr/bin/apisix:4: unexpected symbol near '#'

查看 /usr/bin/apisix 发现:

#! /usr/local/openresty/luajit/bin/luajit
package.path = "/usr/local/apisix/?.lua;" .. package.path

#
...

应该是这个样子才对的吧:

#!/bin/bash

...

看了一下 install_common.sh 中的内容,这一块有问题

    if [ "${checkout_v}" = "master" ] || [ "${checkout_v:0:1}" != "v" -a "${checkout_v}" \> "2.2" ] || [ "${checkout_v:0:1}" = "v" -a "${checkout_v:1}" \> "2.2" ]; then
        echo 'use shell '
    else
        bin='#! /usr/local/openresty/luajit/bin/luajit\npackage.path = "/usr/local/apisix/?.lua;" .. package.path'
        sed -i "1s@.*@$bin@" /tmp/build/output/apisix/usr/bin/apisix
    fi
    cp -r /usr/local/apisix/* /tmp/build/output/apisix/usr/local/apisix/
    mv /tmp/build/output/apisix/usr/local/apisix/deps/share/lua/5.1/apisix /tmp/build/output/apisix/usr/local/apisix/
    if [ "${checkout_v}" = "master" ] || [ "${checkout_v:0:1}" != "v" -a "${checkout_v}" \> "2.2" ] || [ "${checkout_v:0:1}" = "v" -a "${checkout_v:1}" \> "2.2" ]; then
        bin='package.path = "/usr/local/apisix/?.lua;" .. package.path'
        sed -i "1s@.*@$bin@" /tmp/build/output/apisix/usr/local/apisix/apisix/cli/apisix.lua
    else
        echo ''
    fi

what's the difference between "APISIX" and "APISIX OpenResty"

according to doc of apisix plugin real-ip (https://apisix.apache.org/zh/docs/apisix/plugins/real-ip/ ), which "requires APISIX to run on APISIX-OpenResty."
and refer to another doc https://apisix.apache.org/docs/apisix/how-to-build/#step-6-build-openresty-for-apache-apisix .
so APISIX is NOT equal to APISIX OpenResty ?

and how to judge whether or not that my installed apisix has include "APISIX OpenResty" feature ,e.g real-ip .

sorry for this somewhat newbie-like question.

apisix on lua5.3

Hello, I would like to ask whether apifix has plans based on lua5.3 now?

I'm now trying to get apifix to work in lua5.3, but I'm having some problems.

If there are relevant documents, it will provide a lot of help.

你好, 我想问一下现在有计划将apisix基于lua5.3运行吗?

我正在尝试做这个,但遇到了一些困难。

如果有相关的文档的话将会很有帮助。

@idbeta

How can I build APISIX-OpenRestry deb or docker image

i found that the official image of apisix will thorw an error of need to build APISIX-OpenResty to support client restriction when i use client-control plugin

i use this cmd make package type=deb app=apisix-base version=2.8 checkout=v2.8 build a deb .
but after i install this package , i don't find any executeable file on my machine
image

i event don't know what is the apisix-base mean and which cmd arguments should i pick
please give me some suggestion and help me solve the problem of need to build APISIX-OpenResty to support client restriction

thanks

Not found changelog in rpm package

apache/apisix#6386 (comment)

After installed apisix-2.12.0-0.el7.x86_64 with yum on CentOS7, I have a look at rpm -q --changelog apisix the changelog, but it shows nothing :-(.

Will the changelog adds to package?

It doesn't specify --changelog at packaging by fpm.

fpm supports changelog flag for rpm dep but not apk:

--rpm-changelog
--dep-changelog
Refers from fpm-cli.

dependent package openresty-* can find it.

[vagrant@lvs ~]$ rpm -q --changelog openresty-openssl111-devel-1.1.1l-1.el7.x86_64
* Tue May 11 2021 Jiahao Wang 1.1.1k-1
- upgraded OpenSSL to 1.1.1k.

* Thu Dec 10 2020 Yichun Zhang (agentzh) 1.1.1i-1
- upgraded OpenSSL to 1.1.1i.

* Mon May 14 2018 Yichun Zhang (agentzh) 1.1.0h-1
- upgraded openresty-openssl to 1.1.0h.

feat: Make this repository versioned

The apache/apisix, apache/apisix-dashboard, and some other projects are using this tool for building and packaging. But they seem always rely on the latest code from the master branch, which actully is a non-persistent dependency.

For example, the #67 renamed the rpm name, which caused CI failures in both apache/apisix and apache/apisix-dashboard.

So I would propose to make this repository under versioning control, as well as only the versioned code could be the dependency of other projects. I would recommend the first version/tag to be 2.0.0.

What do you think? @spacewander @tzssangglass

feat: Add distribution information for rpm

In general, the name of the rpm artifact often contains the distribution of the supported OS. For example, openresty-1.19.3.2-1.el8.x86_64.rpm shows that it's for CentOS 8. While the rpm files for apisix do not contain the distribution information and users may get confused to know which OS the apisix-2.8-0.x86_64.rpm is for.

So it would be great if we could make use of the --rpm-dist flag of fpm to add the distribution of rpm, such as: apisix-2.8-0.el8.x86_64.rpm. Furthermore, this improvement may also allow us to make one rpm artifact for each version of one distribution.

BTW: the 1 is often used as the first release version of one rpm. So do we need to change the current 0 to 1, like: apisix-2.8-1.el8.x86_64.rpm?

Any feedback is welcome. Thanks.

[Need help] The discovery code is lost when builded with the master branch of apisix

I used the master branch of apisix to make a package, but I found that the code of the discovery part is missing after the package is installed。
before:
image
after:
image
And I found that apisix did make code adjustments to the discovery module:
image
By the way,my build command:

make package type=rpm app=apisix version=master-copy checkout=master-cvte image_base=centos image_tag=7 local_code_path=apisix-master-copy openresty=apisix-base

Failed to install apisix on RHEL 8 compatible distribution

Problem

After installing apache-apisix-repo, apisix can't be installed.

Actual

$ sudo yum install -y https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
$ LANG=C sudo dnf install apisix
Last metadata expiration check: 0:03:47 ago on Tue Jun 28 15:29:29 2022.
Error: 
 Problem: cannot install the best candidate for the job
  - nothing provides apisix-base >= 1.19.9.1.6 needed by apisix-2.14.1-0.el8.x86_64
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

Expected

sudo dnf install -y apisix succeeds and apisix and apisix-base package is installed on.

Additional information

# cat /etc/redhat-release 
Rocky Linux release 8.6 (Green Obsidian)
# dnf info apisix         
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:10:28 ago on Tue Jun 28 06:24:32 2022.
Available Packages
Name         : apisix
Version      : 2.14.1
Release      : 0.el8
Architecture : x86_64
Size         : 2.2 M
Source       : apisix-2.14.1-0.el8.src.rpm
Repository   : release
Summary      : Apache APISIX is a distributed gateway for APIs and Microservices, focused on high performance and reliability.
URL          : http://apisix.apache.org/
License      : ASL 2.0
Description  : Apache APISIX is a distributed gateway for APIs and Microservices, focused on high performance and reliability.

It is strange that it points .el7 package.

# dnf info apisix-base
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:10:43 ago on Tue Jun 28 06:24:32 2022.
Available Packages
Name         : apisix-base
Version      : 1.19.3.2.0
Release      : 0.el7
Architecture : x86_64
Size         : 35 M
Source       : apisix-base-1.19.3.2.0-0.el7.src.rpm
Repository   : release
Summary      : APISIX's OpenResty distribution.
URL          : http://apisix.apache.org/
License      : ASL 2.0
Description  : APISIX's OpenResty distribution.

In a few weeks before, it could be installed.

(Before, apisix-base 1.21.4.1.0 was available)

# LANG=C dnf info apisix-base
Last metadata expiration check: 0:00:49 ago on Tue Jun 28 15:52:25 2022.
Installed Packages
Name         : apisix-base
Version      : 1.21.4.1.0
Release      : 0.el8
Architecture : x86_64
Size         : 119 M
Source       : apisix-base-1.21.4.1.0-0.el8.src.rpm
Repository   : @System
From repo    : release
Summary      : APISIX's OpenResty distribution.
URL          : http://apisix.apache.org/
License      : ASL 2.0
Description  : APISIX's OpenResty distribution.

Maybe we should release the apisix arm64 rpm package

In some IDCs, we need the apisix server to run in linux/arm64 server, just like our current linux/amd64 server online.

So, I suggest we should supply the arm64 rpm package to meet the future, not only the x86-64 rpm package.

What do you think about it?

feat: deb support

Background

For the convenience of Ubuntu/Debian users, we need to support deb.

TODO

Based on the current situation, the following points need to be completed:

  • deb for APISIX
  • deb for APISIX Dashboard
  • deb for APISIX's OpenResty

And test for them:

  • Test for APISIX deb
  • Test for APISIX Dashboard deb
  • Test for APISIX's OpenResty deb

proposal: new packaging method

Background

Some time ago I researched some well-known open source projects, compared their packaging methods, and found that the packaging method of Apache APISIX method has many problems.

  1. The packaging method of Apache APISIX is to use shell scripts to execute, which greatly depends on the environment of the packaging machine. If you want to maintain the same packaging environment every time, we should use docker to deploy.
  2. Deb package or other type packages are not supported,
  3. APISIX and APISIX dashboard packaging scripts are different, there is no unified entry.

I think they need to be improved.

How

  1. Use makefile to achieve a unified packaging entry
  2. There is no dependency on the packaged host environment, and the packaged environment needs to be deployed by dockerfile
  3. Support rpm, deb and other types of packages according to makefile parameters
  4. Support APISIX and dashboard packages according to the parameters of makefile

References

https://github.com/Kong/kong-build-tools
https://github.com/apache/apisix-docker/blob/master/all-in-one/apisix-dashboard/Dockerfile

Error: Could not load rockspec file /apisix/./rockspec/apisix-master-0.rockspec (Error loading file: [string "/apisix/./rockspec/apisix-master-0.rockspec"]:77: '}' expected (to close '{' at line 33) near '.') The command '/bin/sh -c /install-common.sh install_apisix && /determine-dist.sh' returned a non-zero code: 1 make: *** [Makefile:121: build-apisix-rpm] Error 1

cause by sed

https://github.com/api7/apisix-build-tools/blob/master/utils/install-common.sh#L77

Error build action

https://github.com/api7/apisix-build-tools/runs/5429589069?check_suite_focus=true

Error: Could not load rockspec file /apisix/./rockspec/apisix-master-0.rockspec (Error loading file: [string "/apisix/./rockspec/apisix-master-0.rockspec"]:77: '}' expected (to close '{' at line 33) near '.')
The command '/bin/sh -c /install-common.sh install_apisix     && /determine-dist.sh' returned a non-zero code: 1
make: *** [Makefile:121: build-apisix-rpm] Error 1

for https://github.com/apache/apisix/blob/master/rockspec/apisix-master-0.rockspec Added

dependencies = {
    "net-url = 0.9-1",
}

replaced with sed result

dependencies = {
    "net-url = "./apisix",
}

I think this https://github.com/api7/apisix-build-tools/blob/master/utils/install-common.sh#L77 sed maybe need update

feat: add running ci regularly

Introduction

APISIX imports new dependencies as it iterates, so to ensure proper packaging, we should perform CI regularly.

detail

I wanted to add this feature because APISIX introduced casbin three days ago, and casbin needs pcre, which causes the packaging tool unable to package the master branch properly.

If we add regularly CI, it will ensure that the new dependencies are installed correctly.

Any feedback is welcome. Thanks.

ci: Failed to build packages on CentOS 7 due to epel repo

For now there's something wrong with get metalink from the epel repository in the CI running on CentOS 7, please see https://github.com/api7/apisix-build-tools/pull/86/checks?check_run_id=3468216581 for details.

+ rpm -ivh epel-release-latest-7.noarch.rpm
warning: epel-release-latest-7.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Preparing...                          ########################################

Updating / installing...

epel-release-7-13                     ########################################

+ yum install -y yum-utils readline-dev readline-devel

Loaded plugins: fastestmirror, ovl

Loading mirror speeds from cached hostfile
 One of the configured repositories failed (Unknown),

 and yum doesn't have enough cached data to continue. At this point the only

 safe thing yum can do is fail. There are a few ways to work "fix" this:
     1. Contact the upstream for the repository and get them to fix the problem.
     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer

        distribution release than is supported by the repository (and the

        packages for the previous distribution release still work).
     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...
     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:
            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>
     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:
            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again

The command '/bin/sh -c /install-common.sh install_apisix_dependencies_rpm' returned a non-zero code: 1

make: *** [Makefile:74: build-apisix-rpm] Error 1
Error: Process completed with exit code 2.

feat: use makefile to build package

Now build packages of apisix (or dashboard) is using different scripts, should use makefile to do it.
According to different parameters, supports build apisix or dashboard package.

Building apisix 2.10.0-0 results in wrong shebang for /usr/bin/apisix

In apache/apisix@98be489 the upstream project changed the shebang from #!/usr/bin/env lua to #!/bin/bash which causes the following error when trying to start it:

$ apisix 
/usr/local/openresty/luajit/bin/luajit: /usr/bin/apisix:4: unexpected symbol near '#'

But even when manually changing the shebang back (and the line added afterwards), the application does not start:

root@host:/opt/software# apisix 
/usr/local/openresty/luajit/bin/luajit /usr/local/apisix/apisix/cli/apisix.lua 
/usr/local/openresty/luajit/bin/luajit: /usr/local/apisix/apisix/cli/apisix.lua:31: module 'apisix.cli.env' not found:
        no field package.preload['apisix.cli.env']
        no file '/usr/local/apisix/deps/share/lua/5.1/apisix/cli/env.lua'
        no file './apisix/cli/env.lua'
        no file '/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/apisix/cli/env.lua'
        no file '/usr/local/share/lua/5.1/apisix/cli/env.lua'
        no file '/usr/local/share/lua/5.1/apisix/cli/env/init.lua'
        no file '/usr/local/openresty/luajit/share/lua/5.1/apisix/cli/env.lua'
        no file '/usr/local/openresty/luajit/share/lua/5.1/apisix/cli/env/init.lua'
        no file '/usr/local/apisix/deps/lib64/lua/5.1/apisix/cli/env.so'
        no file '/usr/local/apisix/deps/lib/lua/5.1/apisix/cli/env.so'
        no file './apisix/cli/env.so'
        no file '/usr/local/lib/lua/5.1/apisix/cli/env.so'
        no file '/usr/local/openresty/luajit/lib/lua/5.1/apisix/cli/env.so'
        no file '/usr/local/lib/lua/5.1/loadall.so'
        no file '/usr/local/apisix/deps/lib64/lua/5.1/apisix.so'
        no file '/usr/local/apisix/deps/lib/lua/5.1/apisix.so'
        no file './apisix.so'
        no file '/usr/local/lib/lua/5.1/apisix.so'
        no file '/usr/local/openresty/luajit/lib/lua/5.1/apisix.so'
        no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
        [C]: in function 'require'
        /usr/local/apisix/apisix/cli/apisix.lua:31: in main chunk
        [C]: at 0x5562cfe732b0

Version 2.3.0 starts without problems.

feat: build and package Apisix for Docker Alpine.

Alpine images will drastically shrink the image size and network cost and have our services start faster. We are planning to extend alpine image to all since some images are based on alpine already.

Any feedback and suggestions are welcome :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.