<@UD8SD7MQQ> you could try using Visual Studio Cod...
# general
w
@crooked-jelly-50877 you could try using Visual Studio Code Remote Containers (https://code.visualstudio.com/docs/remote/containers) That's what I'm using on Windows for a consistent Ubuntu environment and it's been great
I set up my docker image with bash completion as follows:
Copy code
FROM ubuntu:bionic

# Install packages
RUN apt-get update \
    && apt-get install -y bash-completion curl gnupg lsb-release \
    && mkdir -p /etc/bash_completion.d \
    && curl -fsSL <https://deb.nodesource.com/gpgkey/nodesource.gpg.key> | apt-key add - \
    && echo "deb <https://deb.nodesource.com/node_12.x> $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/node.list \
    && curl -fsSL <https://dl.yarnpkg.com/debian/pubkey.gpg> | apt-key add - \
    && echo "deb <https://dl.yarnpkg.com/debian/> stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update \
    && apt-get install -y nodejs yarn \
    && npm completion > /etc/bash_completion.d/npm \
    && curl -fsSL <https://raw.githubusercontent.com/dsifford/yarn-completion/master/yarn-completion.bash> > /etc/bash_completion.d/yarn \
    && rm -rf /var/lib/apt/lists/*

# Install kubectl; <https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl>
RUN curl -fsSL <https://storage.googleapis.com/kubernetes-release/release/v1.14.7/bin/linux/amd64/kubectl> > /usr/local/bin/kubectl \
    && chmod +x /usr/local/bin/kubectl \
    && kubectl completion bash > /etc/bash_completion.d/kubectl \
    && echo "alias k='kubectl'\ncomplete -o default -F __start_kubectl k" >> ~/.bashrc \
    && kubectl version --client --short

# Install aws iam authenticator; <https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html>
RUN curl -fsSL <https://github.com/kubernetes-sigs/aws-iam-authenticator/releases/download/v0.4.0/aws-iam-authenticator_0.4.0_linux_amd64> > /usr/local/bin/aws-iam-authenticator \
    && chmod +x /usr/local/bin/aws-iam-authenticator

# Install helm; <https://github.com/helm/helm/blob/master/docs/install.md>
RUN curl -fsSL <https://get.helm.sh/helm-v2.16.1-linux-amd64.tar.gz> | tar -xzO linux-amd64/helm > /usr/local/bin/helm \
    && chmod +x /usr/local/bin/helm \
    && helm completion bash > /etc/bash_completion.d/helm \
    && helm init --client-only \
    && helm version --client --short

# Install Pulumi
ENV PULUMI_VERSION=1.5.2 PULUMI_SKIP_UPDATE_CHECK=true

RUN curl -fsSL <https://get.pulumi.com> | bash -s -- --version $PULUMI_VERSION \
    && sed -i -e '/# add Pulumi to the PATH/,/export PATH=/d' ~/.bashrc \
    && mv ~/.pulumi/bin/* /usr/local/bin \
    && pulumi gen-completion bash > /etc/bash_completion.d/pulumi \
    && echo "alias p='pulumi'\ncomplete -o default -F __start_pulumi p" >> ~/.bashrc \
    && pulumi version

ENTRYPOINT [ "pulumi" ]
`.devcontainer/devcontainer.json`:
Copy code
{
  "name": "Pulumi",
  "dockerFile": "Dockerfile",
  "context": "..",
  "runArgs": [
    "-v",
    "/var/run/docker.sock:/var/run/docker.sock",
    "-e",
    "AWS_ACCESS_KEY_ID",
    "-e",
    "AWS_SECRET_ACCESS_KEY",
    "-e",
    "AWS_REGION",
    "-e",
    "PULUMI_ACCESS_TOKEN"
  ],
  "settings": {
    "terminal.integrated.shell.linux": null
  },
  "extensions": [
    "ms-vscode.vscode-typescript-tslint-plugin"
  ]
}
c
Interesting. I gather that the .pulumi directory is always in the container, and you do not map it to the users host .pulumi?
Do they lose history, etc. if they exit the container?
w
The source is in my local directory, on Windows, and appears in the container when I initiate remote containers mode.
I can edit in VS Code and I see the change locally; i.e. it's a host mounted volume, or at least behaves like one.
You can use the same trick for remote SSH or cloud shells
One last thing, for the bash completion to work, add the following to your VS Code settings:
Copy code
{
  "terminal.integrated.shellArgs.linux": [
    "-l"
  ]
}
c
I gather the plugins would be installed as Linux, and the user would always have to use pulumi from the container, they could not run the native Windows one?
w
Re
.pulumi
, I move the binary to
/usr/local/bin
in my image
c
(which might be fine - we would need to explain this to avoid confusion)
Are your plugins/ in your local dir Linux or Windows binaries?
w
Not sure, I haven't dealt with plugins directly.
Copy code
root@9df9b591f799:~# ll -R ~/.pulumi
/root/.pulumi:
total 16
drwxr-xr-x 3 root root 4096 Nov 13 17:53 ./
drwx------ 1 root root 4096 Nov 13 19:00 ../
drwx------ 2 root root 4096 Nov 13 17:53 bin/

/root/.pulumi/bin:
total 8
drwx------ 2 root root 4096 Nov 13 17:53 ./
drwxr-xr-x 3 root root 4096 Nov 13 17:53 ../
What am I looking for?
c
not sure why you dont have a .pulumi/plugins/
Copy code
ls -lR plugins/
plugins/:
total 4
drwx------ 2 warren_strange warren_strange 4096 Nov 13 14:45 resource-gcp-v1.3.0
plugins/resource-gcp-v1.3.0:
total 84604
-rwxr-xr-x 1 warren_strange warren_strange 86634321 Nov 13 14:45 pulumi-resource-gcp
where are all your credentials.json, history, etc.
w
Creds for aws? I use env vars injected into the container
Same with Pulumi token
It's basically a portable dockerized dev env
c
ok, and you use the pulumi backend state service I assume -so the container does not need to remember state?
w
Yes
c
OK - I’m checking out the vscode plugin now 😉
Thanks for the tip