Running complex shell script in Dockerfile - bash

I am running windows binaries in a linux container using wine. For convenience, I create runnable shortcuts that invoke wine behind the scenes so my python code invoking these CLI tools works fine in Windows and Linux.
This is how my shortcut generation looks like:
for exe in /opt/tools/bin/*.exe; do
tool="${exe##*/}"
tool="${tool%.exe}"
cat <<EOF > /opt/app/bin/${tool}
#!/bin/bash
wine /opt/tools/bin/${tool}.exe "\${#}"
EOF
chmod 755 /opt/app/bin/${tool}
done
I tried to run this in a RUN command straight in the Dockerfile but that failed with some cryptic error, so I ended up just storing the script in a file that I copy into the image and then run.
COPY ./docker/shortcut_generator.sh ./
RUN ./shortcut_generator.sh
In a way, I have solved the issue, but I can't help but wonder if someone more knowledgeable on Dockerfile syntax than me could inline that snippet in the Dockerfile.

Related

How to run SDKMAN on shell script

I am trying to run sdkman on a shell script that I call run.sh. This is what the inside of the shell script looks like:
sdk use java 8.0.302-open
When I run the command in a terminal, it works. But when I run it in a shell script, I get this error:
run.sh: 1: sdk: not found
Anyone knows how to fix this?
I fixed it for me; Although this may not work for others.
I placed #!/bin/bash at the top of the shell script, and then added this after it:
source "$HOME/.sdkman/bin/sdkman-init.sh"
Then my shell script was able to be ran using:
./run.sh
sdkman was able to work this time.

Specify which shell NPM scripts run in

I've run into a pretty dumb and frustrating issue.
My team is using this script quite regularly for development
cd client && source .env && yarn run start
They are all on macOS and it works fine. I am on Ubuntu and for some reason NPM sends this command to sh instead of bash (on sh the source command is . ) which throws an error.
I've spent hours trying to figure out how to change that but I can't see anything. Is there some setting I can change? Why does NPM choose sh instead of the much more common bash or zsh? Is there anything I can do to fix this?

run typescript compiler from shell command - permission denied

I'm using Parallels because I prefer the Mac OS but the work we do is all in Visual Studio. We currently have a build.cmd batch file that builds our typescript files. Because I'd prefer to work on the Mac side when I can, I thought I would rewrite the script in bash and to also get some experience writing a shell script. I have a main build.sh command that runs the other shell scripts like compile-templates.sh and compile-source.sh. I am trouble with the compile-source.sh portion now. Currently, the batch file looks like:
echo TypeScript Version:
CALL node_modules\.bin\tsc -v
The typescript compiler is included in our Solution so we are all using the same one throughout the solution. In my compile-source.sh, I try to do this:
node_modules/.bin/tsc -v
or this
./node_modules/.bin/tsc -v
And I get permission denied. Is there something I'm doing wrong?
There are several approaches to try. You can use bash to run the script like this:
bash node_modules/.bin/tsc -v
Or you can try to change the permissions on the file:
chmod a+x node_modules/.bin/tsc
This should enable you to run the script like this:
./node_modules/.bin/tsc -v
But in that case, make sure your script starts with a shebang line to tell the system it is a bash script:
#!/usr/bin/env bash

Activating a VirtualEnv using a shell script doesn't seem to work

I tried activating a VirtualEnv through a shell script like the one below but it doesn't seem to work,
#!/bin/sh
source ~/.virtualenvs/pinax-env/bin/activate
I get the following error
$ sh virtualenv_activate.sh
virtualenv_activate.sh: 2: source: not found
but if I enter the same command on terminal it seems to work
$ source ~/.virtualenvs/pinax-env/bin/activate
(pinax-env)gautam#Aspirebuntu:$
So I changed the shell script to
#!/bin/bash
source ~/.virtualenvs/pinax-env/bin/activate
as suggested and used
$ bash virtualenv_activate.sh
gautam#Aspirebuntu:$
to run the script .
That doesn't throw an error but neither does that activate the virtual env
So any suggestion on how to solve this problem ?
PS : I am using Ubuntu 11.04
TLDR
Must run the .sh script with source instead of the script solely
source your-script.sh
and not
your-script.sh
Details
sh is not the same as bash (although some systems simply link sh to bash, so running sh actually runs bash). You can think of sh as a watered down version of bash. One thing that bash has that sh does not is the "source" command. This is why you're getting that error... source runs fine in your bash shell. But when you start your script using sh, you run the script in an shell in a subprocess. Since that script is running in sh, "source" is not found.
The solution is to run the script in bash instead. Change the first line to...
#!/bin/bash
Then run with...
./virtualenv_activate.sh
...or...
/bin/bash virtualenv_activate.sh
Edit:
If you want the activation of the virtualenv to change the shell that you call the script from, you need to use the "source" or "dot operator". This ensures that the script is run in the current shell (and therefore changes the current environment)...
source virtualenv_activate.sh
...or...
. virtualenv_activate.sh
As a side note, this is why virtualenv always says you need to use "source" to run it's activate script.
source is an builtin shell command in bash, and is not available in sh. If i remember correctly then virtual env does a lot of path and environment variables manipulation. Even running it as bash virtualenv_blah.sh wont work since this will simply create the environment inside the sub-shell.
Try . virtualenv_activate.sh or source virtualenv_activate.sh this basically gets the script to run in your current environment and all the environment variables modified by virtualenv's activate will be available.
HTH.
Edit: Here is a link that might help - http://ss64.com/bash/period.html
On Mac OS X your proposals seems not working.
I have done it this way. I'am not very happy with solution, but share it anyway here and hope, that maybe somebody will suggest the better one:
In activate.sh I have
echo 'source /Users/andi/.virtualenvs/data_science/bin/activate'
I give execution permissions by: chmod +x activate.sh
And I execute this way:
`./activate.sh`
Notice that there are paranthesis in form of ASCII code 96 = ` ( Grave accent )
For me best way work as below.
Create start-my-py-software.sh and pest below code
#!/bin/bash
source "/home/snippetbucket.com/source/AIML-Server-CloudPlatform/bin/activate"
python --version
python /home/snippetbucket.com/source/AIML-Server-CloudPlatform/main.py
Give file permission to run like below.
chmod +x start-my-py-software.sh
Now run like below
.start-my-py-software.sh
and that's it, start my python based server or any other code.
ubuntu #18.0
In my case, Ubuntu 16.04, the methods above didn't worked well or it needs much works.
I just made a link of 'activate' script file and copy it to home folder(or $PATH accessible folder) and renamed it simple one like 'actai'.
Then in a terminal, just call 'source actai'. It worked!

Make executable erlang program on the Mac Terminal

I'm very new to Erlang. I've tried now several hours to find out how to run my sample scripts without the Erlang Shell.
I have installed Erlang with Mac Ports, and I can access the Shell, write Scripts etc.
But I try to run my program in the Mac Terminal.
On this page [1] they are using ecc and elink. I don't have these programs in my installation.
Can you please provide me a way, how I can solve my problem?
Thanks and regards
chris
[1] http://www.sics.se/~joe/sae.html
You need to add:
#!/usr/bin/env escript
at the beginning of your script and make it executable (as #nomulous said):
chmod u+x myscript
Then you can run it like this:
./myscript
if it is in your current directory, or by giving its relative or full path otherwise, e.g.:
~/Desktop/myscript
Reference: the page you gave section Erlang Scripts
If your script is not executable, it won't run outside of the shell.
To make it executable, use chmod +x your_script_here.
Try rebar (https://bitbucket.org/basho/rebar/wiki/Home) :)

Resources