Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved configuration #14

Merged
merged 16 commits into from
Apr 20, 2016
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 2 additions & 10 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
# build outputs
*.pyc

# credentials
_env*
manta
manta.pub

# temp
python-manta/
.DS_Store
_env
31 changes: 17 additions & 14 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ FROM percona:5.6

RUN apt-get update \
&& apt-get install -y \
python \
python-dev \
gcc \
curl \
percona-xtrabackup \
python \
python-dev \
gcc \
Copy link
Contributor Author

@misterbisson misterbisson Apr 18, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd love to try adding the pip install steps in here so we can apt-get purge GCC after it's done its job, similar to https://github.com/autopilotpattern/nfsserver/blob/wip/Dockerfile#L8-L19.

curl \
percona-xtrabackup \
&& rm -rf /var/lib/apt/lists/*

# get Python drivers MySQL, Consul, and Manta
Expand All @@ -17,22 +17,25 @@ RUN curl -Ls -o get-pip.py https://bootstrap.pypa.io/get-pip.py && \
python-Consul==0.4.7 \
manta==2.5.0

# get Containerpilot release
RUN export CP_VERSION=2.0.1 &&\
curl -Lo /tmp/containerpilot.tar.gz \
https://github.com/joyent/containerpilot/releases/download/${CP_VERSION}/containerpilot-${CP_VERSION}.tar.gz && \
tar -xzf /tmp/containerpilot.tar.gz && \
mv /containerpilot /bin/
# Add ContainerPilot and set its configuration file path
ENV CONTAINERPILOT_VER 2.0.1
ENV CONTAINERPILOT file:///etc/containerpilot.json
RUN export CONTAINERPILOT_CHECKSUM=a4dd6bc001c82210b5c33ec2aa82d7ce83245154 \
&& curl -Lso /tmp/containerpilot.tar.gz \
"https://github.com/joyent/containerpilot/releases/download/${CONTAINERPILOT_VER}/containerpilot-${CONTAINERPILOT_VER}.tar.gz" \
&& echo "${CONTAINERPILOT_CHECKSUM} /tmp/containerpilot.tar.gz" | sha1sum -c \
&& tar zxf /tmp/containerpilot.tar.gz -C /usr/local/bin \
&& rm /tmp/containerpilot.tar.gz

# configure Containerpilot and MySQL
COPY bin/* /bin/
# configure ContainerPilot and MySQL
COPY etc/* /etc/
COPY bin/* /usr/local/bin/

# override the parent entrypoint
ENTRYPOINT []

# use --console to get error logs to stderr
CMD [ "/bin/containerpilot", \
CMD [ "/usr/local/bin/containerpilot", \
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason not to drop the /usr/local/bin/ and just have CMD [ "containerpilot", ... and rely on PATH?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Like we do one line later with mysqld)

"mysqld", \
"--console", \
"--log-bin=mysql-bin", \
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

MySQL designed for container-native deployment on Joyent's Triton platform. This repo serves as a blueprint demonstrating the autopilot design pattern -- automatically setting up replication, backups, and failover without human intervention.

[![DockerPulls](https://img.shields.io/docker/pulls/autopilotpattern/mysql.svg)](https://registry.hub.docker.com/u/autopilotpattern/mysql/)
[![DockerStars](https://img.shields.io/docker/stars/autopilotpattern/mysql.svg)](https://registry.hub.docker.com/u/autopilotpattern/mysql/)
[![ImageLayers](https://badge.imagelayers.io/autopilotpattern/mysql:latest.svg)](https://imagelayers.io/?images=autopilotpattern/mysql:latest)
[![Join the chat at https://gitter.im/autopilotpattern/mysql](https://badges.gitter.im/autopilotpattern/mysql.svg)](https://gitter.im/autopilotpattern/mysql)
Copy link
Contributor Author

@misterbisson misterbisson Apr 18, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaces #8

Update: I moved this change to a separate PR: #15


---

## Architecture
Expand Down
17 changes: 0 additions & 17 deletions _env-example

This file was deleted.

18 changes: 9 additions & 9 deletions bin/triton-mysql.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

log = logging.getLogger('triton-mysql')

consul = pyconsul.Consul(host=os.environ.get('TRITON_MYSQL_CONSUL', 'consul'))
consul = pyconsul.Consul(host=os.environ.get('CONSUL', 'consul'))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For #11

config = None

# consts for node state
Expand Down Expand Up @@ -175,7 +175,7 @@ def __init__(self):
self.user = os.environ.get('MANTA_SUBUSER', None)
self.role = os.environ.get('MANTA_ROLE', None)
self.key_id = os.environ.get('MANTA_KEY_ID', None)
self.private_key = os.environ.get('MANTA_PRIVATE_KEY')
self.private_key = os.environ.get('MANTA_PRIVATE_KEY') # @TODO: need changes here
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will need to be aware of the text munging of the input.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should do it:

self.private_key = os.environ.get('MANTA_PRIVATE_KEY').replace('#', '\n')

self.url = os.environ.get('MANTA_URL',
'https://us-east.manta.joyent.com')
self.bucket = os.environ.get('MANTA_BUCKET',
Expand Down Expand Up @@ -205,13 +205,13 @@ def put_backup(self, backup_id, infile):

class Containerpilot(object):
"""
Containerpilot config is where we rewrite Containerpilot's own config
Containerpilot config is where we rewrite ContainerPilot's own config
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I correctly capitalized ContainerPilot in all the text, but left it as Containerpilot when referencing the class.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can always just capitalize the Containerpilot class too... it's perfectly idiomatic Python to do so.

so that we can dynamically alter what service we advertise
"""

def __init__(self, node):
# TODO: we should make sure we can support JSON-in-env-var
# the same as Containerpilot itself
# the same as ContainerPilot itself
self.node = node
self.path = os.environ.get('CONTAINERPILOT').replace('file://', '')
with open(self.path, 'r') as f:
Expand All @@ -231,12 +231,12 @@ def render(self):
f.write(new_config)

def reload(self):
""" force Containerpilot to reload its configuration """
log.info('Reloading Containerpilot configuration.')
""" force ContainerPilot to reload its configuration """
log.info('Reloading ContainerPilot configuration.')
os.kill(1, signal.SIGHUP)

# ---------------------------------------------------------
# Top-level functions called by Containerpilot or forked by this program
# Top-level functions called by ContainerPilot or forked by this program

def on_start():
"""
Expand All @@ -257,7 +257,7 @@ def on_start():
def health():
"""
Run a simple health check. Also acts as a check for whether the
Containerpilot configuration needs to be reloaded (if it's been
ContainerPilot configuration needs to be reloaded (if it's been
changed externally), or if we need to make a backup because the
backup TTL has expired.
"""
Expand Down Expand Up @@ -793,7 +793,7 @@ def write_snapshot(conn):
# create_snapshot call and return. The snapshot process will be
# re-parented to Containerpilot
set_backup_ttl()
subprocess.Popen(['python', '/bin/triton-mysql.py', 'create_snapshot'])
subprocess.Popen(['python', '/usr/local/bin/triton-mysql.py', 'create_snapshot'])
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couldn't this rely on PATH too, or does python not check PATH when looking for the file? Any particular reason to python ... explicitly here and not just +x and shebang the script?


def set_backup_ttl():
"""
Expand Down
38 changes: 30 additions & 8 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,33 @@
mysql:
extends:
file: common-compose.yml
service: mysql
links:
- consul:consul
image: autopilotpattern/mysql:latest
mem_limit: 4g
restart: always
# expose for linking, but each container gets a private IP for
# internal use as well
expose:
- 3306
labels:
- triton.cns.services=mysql
env_file: _env
environment:
- CONTAINERPILOT=file:///etc/containerpilot.json
- MANTA_PRIVATE_KEY
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can (and probably should) eliminate this line because we're getting it from the _env file now.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was the issue I was facing in #14 (comment)


consul:
extends:
file: common-compose.yml
service: consul
image: progrium/consul:latest
command: -server -bootstrap -ui-dir /ui
restart: always
mem_limit: 128m
ports:
- 8500
expose:
- 53
- 8300
- 8301
- 8302
- 8400
- 8500
dns:
- 127.0.0.1
labels:
- triton.cns.services=consul
6 changes: 3 additions & 3 deletions etc/containerbuddy.json → etc/containerpilot.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"consul": "{{ .CONSUL }}:8500",
"onStart": "python /bin/triton-mysql.py",
"preStart": "python /usr/local/bin/triton-mysql.py",
"services": [
{
"name": "mysql",
"port": 3306,
"health": "python /bin/triton-mysql.py health",
"health": "python /usr/local/bin/triton-mysql.py health",
"poll": 5,
"ttl": 25
}
Expand All @@ -14,7 +14,7 @@
{
"name": "mysql-primary",
"poll": 10,
"onChange": "python /bin/triton-mysql.py on_change"
"onChange": "python /usr/local/bin/triton-mysql.py on_change"
}
]
}
6 changes: 4 additions & 2 deletions local-compose.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
mysql:
extends:
file: common-compose.yml
file: docker-compose.yml
service: mysql
mem_limit: 512m
build: .
environment:
- CONSUL=consul
links:
- consul:consul
ports:
- 3306

consul:
extends:
file: common-compose.yml
file: docker-compose.yml
service: consul
ports:
- 8500:8500
Loading