Skip to content

Commit 2c3b59a

Browse files
committed
extract config files from install.sh
1 parent 5d2026c commit 2c3b59a

File tree

7 files changed

+87
-240
lines changed

7 files changed

+87
-240
lines changed

.devcontainer/devcontainer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@
3434
],
3535
// Mount the parent as /workspaces so we can pip install peers as editable
3636
"workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind",
37-
"initializeCommand": "mkdir -p ${localEnv:HOME}/.config/devcontainer_rc"
37+
"initializeCommand": "mkdir -p ${localEnv:HOME}/.config/devcontainer_rc",
38+
"remoteUser": "root"
3839
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/bin/bash
2+
3+
# This bashrc will be source from /root/.bashrc upon launch of every terminal
4+
# in a devcontainer that uses the bash-config feature from
5+
# https://github.com/DiamondLightSource/devcontainer-features
6+
7+
# This file is initialized by bash-config, but you are then free to edit it
8+
9+
# execute default, opinionated settings - delete this line to remove defaults
10+
source $CONFIG_FOLDER/feature_settings_rc
11+
12+
# add your personal custom settings below
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/bin/bash
2+
3+
# default opinioned bash configuration
4+
5+
# set the prompt
6+
export PS1="\[\033[1;34m\]\W \[\033[0m\]# "
7+
8+
# enable enternal shared history
9+
export HISTCONTROL=ignoreboth:erasedups
10+
export HISTSIZE=-1
11+
export HISTFILESIZE=-1
12+
export SAVEHIST=-1
13+
export HISTFILE=$CONFIG_FOLDER/.bash_eternal_history
14+
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Readline configuration for bash shell.
2+
3+
# Incremental history searching with up and down arrows (C-P and C-N for old
4+
# style navigation).
5+
"\e[A": history-search-backward
6+
"\e[B": history-search-forward
7+
8+
# Control left and right for word movement
9+
"\e[5C": forward-word
10+
"\e[5D": backward-word
Lines changed: 17 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,25 @@
11
#!/bin/bash
2-
set -e
3-
4-
echo "Activating feature 'terminal-history'"
5-
echo "User: ${_REMOTE_USER} User home: ${_REMOTE_USER_HOME}"
6-
7-
mkdir -p $CONFIG_STAGING
8-
9-
# -------------------------------------------------------------------------------
10-
cat > $CONFIG_STAGING/onCreateCommand.sh \
11-
<< EOF
12-
#!/bin/bash
13-
14-
# copy in the opinionated default settings from the feature
15-
cp $CONFIG_STAGING/feature_settings_rc $CONFIG_FOLDER/feature_settings_rc
16-
17-
# copy in the user editable settings unless they already exist
18-
if [[ ! -f $CONFIG_FOLDER/bashrc ]] ; then
19-
cp $CONFIG_STAGING/bashrc $CONFIG_FOLDER
20-
cp $CONFIG_STAGING/inputrc $CONFIG_FOLDER
21-
fi
222

23-
# hook in the config to the root account
24-
ln -s $CONFIG_FOLDER/inputrc /root/.inputrc
25-
echo "source $CONFIG_FOLDER/bashrc" >> /root/.bashrc
26-
EOF
27-
28-
# -------------------------------------------------------------------------------
29-
cat > $CONFIG_STAGING/inputrc \
30-
<< EOF
31-
# Readline configuration for bash shell.
32-
33-
# Incremental history searching with up and down arrows (C-P and C-N for old
34-
# style navigation).
35-
"\e[A": history-search-backward
36-
"\e[B": history-search-forward
37-
38-
# Control left and right for word movement
39-
"\e[5C": forward-word
40-
"\e[5D": backward-word
41-
EOF
42-
43-
# -------------------------------------------------------------------------------
44-
cat > $CONFIG_STAGING/bashrc \
45-
<< EOF
46-
#!/bin/bash
3+
# abort on error
4+
set -e
475

48-
# execute default opinionated settings - delete this line to remove defaults
49-
source $CONFIG_FOLDER/feature_settings_rc
6+
# discover where the install.sh and peers have been extracted to
7+
this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
508

51-
# add your personal custom settings below
52-
EOF
539

54-
# -------------------------------------------------------------------------------
55-
cat > $CONFIG_STAGING/feature_settings_rc \
56-
<< EOF
57-
#!/bin/bash
10+
echo "Activating feature 'terminal-history'"
11+
echo "User: ${_REMOTE_USER} User home: ${_REMOTE_USER_HOME}"
5812

59-
# default opinioned bash configuration
13+
# This script is run at container build time.
14+
#
15+
# Here we place all the configuration files in a staging area.
16+
#
17+
# Then at container runtime, when the hosts' config folder is mounted in, we
18+
# can copy from the staging area to the mounted host folder
19+
#
20+
# The runtime copy to host folder is performed once oby onCreateCommand.sh
6021

61-
# set the prompt
62-
export PS1="\[\033[1;34m\]\W \[\033[0m\]# "
22+
mkdir -p "$CONFIG_STAGING"
23+
cp -r "$this_dir"/* "$CONFIG_STAGING"
24+
echo $this_dir > "$CONFIG_STAGING/this_dir"
6325

64-
# enable enternal shared history
65-
export HISTCONTROL=ignoreboth:erasedups
66-
export HISTSIZE=-1
67-
export HISTFILESIZE=-1
68-
export SAVEHIST=-1
69-
export HISTFILE=$CONFIG_FOLDER/.bash_eternal_history
70-
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
71-
EOF
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/bash
2+
3+
# this script is run once inside the developer container at creation time
4+
5+
# copy in the opinionated default settings from the feature
6+
cp $CONFIG_STAGING/feature_settings_rc $CONFIG_FOLDER/feature_settings_rc
7+
8+
# copy in the user editable settings unless they already exist
9+
if [[ ! -f $CONFIG_FOLDER/bashrc ]] ; then
10+
cp $CONFIG_STAGING/bashrc $CONFIG_FOLDER
11+
cp $CONFIG_STAGING/inputrc $CONFIG_FOLDER
12+
fi
13+
14+
# hook in the config to the root account
15+
ln -s $CONFIG_FOLDER/inputrc /root/.inputrc
16+
echo "source $CONFIG_FOLDER/bashrc" >> /root/.bashrc

README.md

Lines changed: 16 additions & 176 deletions
Original file line numberDiff line numberDiff line change
@@ -1,188 +1,28 @@
1-
# Dev Container Features: Self Authoring Template
1+
# Dev Container Features
22

3-
> This repo provides a starting point and example for creating your own custom [dev container Features](https://containers.dev/implementors/features/), hosted for free on GitHub Container Registry. The example in this repository follows the [dev container Feature distribution specification](https://containers.dev/implementors/features-distribution/).
4-
>
5-
> To provide feedback to the specification, please leave a comment [on spec issue #70](https://github.com/devcontainers/spec/issues/70). For more broad feedback regarding dev container Features, please see [spec issue #61](https://github.com/devcontainers/spec/issues/61).
3+
Some features for use in Python Copier Template development containers. Also intended to be generally useful in any developer container.
64

7-
## Example Contents
5+
## bash-config
86

9-
This repository contains a _collection_ of two Features - `hello` and `color`. These Features serve as simple feature implementations. Each sub-section below shows a sample `devcontainer.json` alongside example usage of the Feature.
7+
Adds customizations to the bash shell that can be shared across all developer containers using the feature.
108

11-
### `hello`
9+
Default setup attempts to be a lightweight replacement for the common-utils feature zsh capabilities, namely:
1210

13-
Running `hello` inside the built container will print the greeting provided to it via its `greeting` option.
11+
- useful prompt
12+
- eternal history (shared across all containers using the feature)
13+
- history search with up/down arrows (.inputrc)
14+
- ctrl-left or right arrow for word navigation (.inputrc)
1415

15-
```jsonc
16-
{
17-
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
18-
"features": {
19-
"ghcr.io/devcontainers/feature-starter/hello:1": {
20-
"greeting": "Hello"
21-
}
22-
}
23-
}
24-
```
16+
## other
2517

26-
```bash
27-
$ hello
18+
Other features may be added here in future.
2819

29-
Hello, user.
30-
```
20+
## Testing
3121

32-
### `color`
22+
This repo has it's own devcontainer which can be used to do local testing of the features.
3323

34-
Running `color` inside the built container will print your favorite color to standard out.
24+
## Publishing Features
3525

36-
```jsonc
37-
{
38-
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
39-
"features": {
40-
"ghcr.io/devcontainers/feature-starter/color:1": {
41-
"favorite": "green"
42-
}
43-
}
44-
}
45-
```
26+
CI publishes the features defined here as follows:-
4627

47-
```bash
48-
$ color
49-
50-
my favorite color is green
51-
```
52-
53-
## Repo and Feature Structure
54-
55-
Similar to the [`devcontainers/features`](https://github.com/devcontainers/features) repo, this repository has a `src` folder. Each Feature has its own sub-folder, containing at least a `devcontainer-feature.json` and an entrypoint script `install.sh`.
56-
57-
```
58-
├── src
59-
│ ├── hello
60-
│ │ ├── devcontainer-feature.json
61-
│ │ └── install.sh
62-
│ ├── color
63-
│ │ ├── devcontainer-feature.json
64-
│ │ └── install.sh
65-
| ├── ...
66-
│ │ ├── devcontainer-feature.json
67-
│ │ └── install.sh
68-
...
69-
```
70-
71-
An [implementing tool](https://containers.dev/supporting#tools) will composite [the documented dev container properties](https://containers.dev/implementors/features/#devcontainer-feature-json-properties) from the feature's `devcontainer-feature.json` file, and execute in the `install.sh` entrypoint script in the container during build time. Implementing tools are also free to process attributes under the `customizations` property as desired.
72-
73-
### Options
74-
75-
All available options for a Feature should be declared in the `devcontainer-feature.json`. The syntax for the `options` property can be found in the [devcontainer Feature json properties reference](https://containers.dev/implementors/features/#devcontainer-feature-json-properties).
76-
77-
For example, the `color` feature provides an enum of three possible options (`red`, `gold`, `green`). If no option is provided in a user's `devcontainer.json`, the value is set to "red".
78-
79-
```jsonc
80-
{
81-
// ...
82-
"options": {
83-
"favorite": {
84-
"type": "string",
85-
"enum": [
86-
"red",
87-
"gold",
88-
"green"
89-
],
90-
"default": "red",
91-
"description": "Choose your favorite color."
92-
}
93-
}
94-
}
95-
```
96-
97-
Options are exported as Feature-scoped environment variables. The option name is captialized and sanitized according to [option resolution](https://containers.dev/implementors/features/#option-resolution).
98-
99-
```bash
100-
#!/bin/bash
101-
102-
echo "Activating feature 'color'"
103-
echo "The provided favorite color is: ${FAVORITE}"
104-
105-
...
106-
```
107-
108-
## Distributing Features
109-
110-
### Versioning
111-
112-
Features are individually versioned by the `version` attribute in a Feature's `devcontainer-feature.json`. Features are versioned according to the semver specification. More details can be found in [the dev container Feature specification](https://containers.dev/implementors/features/#versioning).
113-
114-
### Publishing
115-
116-
> NOTE: The Distribution spec can be [found here](https://containers.dev/implementors/features-distribution/).
117-
>
118-
> While any registry [implementing the OCI Distribution spec](https://github.com/opencontainers/distribution-spec) can be used, this template will leverage GHCR (GitHub Container Registry) as the backing registry.
119-
120-
Features are meant to be easily sharable units of dev container configuration and installation code.
121-
122-
This repo contains a **GitHub Action** [workflow](.github/workflows/release.yaml) that will publish each Feature to GHCR.
123-
124-
*Allow GitHub Actions to create and approve pull requests* should be enabled in the repository's `Settings > Actions > General > Workflow permissions` for auto generation of `src/<feature>/README.md` per Feature (which merges any existing `src/<feature>/NOTES.md`).
125-
126-
By default, each Feature will be prefixed with the `<owner/<repo>` namespace. For example, the two Features in this repository can be referenced in a `devcontainer.json` with:
127-
128-
```
129-
ghcr.io/devcontainers/feature-starter/color:1
130-
ghcr.io/devcontainers/feature-starter/hello:1
131-
```
132-
133-
The provided GitHub Action will also publish a third "metadata" package with just the namespace, eg: `ghcr.io/devcontainers/feature-starter`. This contains information useful for tools aiding in Feature discovery.
134-
135-
'`devcontainers/feature-starter`' is known as the feature collection namespace.
136-
137-
### Marking Feature Public
138-
139-
Note that by default, GHCR packages are marked as `private`. To stay within the free tier, Features need to be marked as `public`.
140-
141-
This can be done by navigating to the Feature's "package settings" page in GHCR, and setting the visibility to 'public`. The URL may look something like:
142-
143-
```
144-
https://github.com/users/<owner>/packages/container/<repo>%2F<featureName>/settings
145-
```
146-
147-
<img width="669" alt="image" src="https://user-images.githubusercontent.com/23246594/185244705-232cf86a-bd05-43cb-9c25-07b45b3f4b04.png">
148-
149-
### Adding Features to the Index
150-
151-
If you'd like your Features to appear in our [public index](https://containers.dev/features) so that other community members can find them, you can do the following:
152-
153-
* Go to [github.com/devcontainers/devcontainers.github.io](https://github.com/devcontainers/devcontainers.github.io)
154-
* This is the GitHub repo backing the [containers.dev](https://containers.dev/) spec site
155-
* Open a PR to modify the [collection-index.yml](https://github.com/devcontainers/devcontainers.github.io/blob/gh-pages/_data/collection-index.yml) file
156-
157-
This index is from where [supporting tools](https://containers.dev/supporting) like [VS Code Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) and [GitHub Codespaces](https://github.com/features/codespaces) surface Features for their dev container creation UI.
158-
159-
#### Using private Features in Codespaces
160-
161-
For any Features hosted in GHCR that are kept private, the `GITHUB_TOKEN` access token in your environment will need to have `package:read` and `contents:read` for the associated repository.
162-
163-
Many implementing tools use a broadly scoped access token and will work automatically. GitHub Codespaces uses repo-scoped tokens, and therefore you'll need to add the permissions in `devcontainer.json`
164-
165-
An example `devcontainer.json` can be found below.
166-
167-
```jsonc
168-
{
169-
"image": "mcr.microsoft.com/devcontainers/base:ubuntu",
170-
"features": {
171-
"ghcr.io/my-org/private-features/hello:1": {
172-
"greeting": "Hello"
173-
}
174-
},
175-
"customizations": {
176-
"codespaces": {
177-
"repositories": {
178-
"my-org/private-features": {
179-
"permissions": {
180-
"packages": "read",
181-
"contents": "read"
182-
}
183-
}
184-
}
185-
}
186-
}
187-
}
188-
```
28+
- bash-config: ghcr.io/gilesknap/devcontainer-features/bash-config:latest

0 commit comments

Comments
 (0)